Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
moq - gomockを使わないMock生成
Search
oinume
June 17, 2024
Programming
0
250
moq - gomockを使わないMock生成
oinume
June 17, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
PHPで TLSのプロトコルを実装してみる
higaki_program
0
280
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
240
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
160
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.4k
AI活用のコスパを最大化する方法
ochtum
0
250
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.1k
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
310
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
140
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
510
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
610
AI 開発合宿を通して得た学び
niftycorp
PRO
0
150
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.4k
Featured
See All Featured
Being A Developer After 40
akosma
91
590k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
110
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
400
Chasing Engaging Ingredients in Design
codingconduct
0
140
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.2k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
160
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Color Theory Basics | Prateek | Gurzu
gurzu
0
260
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
270
Thoughts on Productivity
jonyablonski
75
5.1k
Mind Mapping
helmedeiros
PRO
1
130
Transcript
moq - gomockを使わない Mock生成 2024-06-18 mercari.go #26 1 @oinume moq
- Generating mock code without gomock
自己紹介 • Kazuhiro Oinuma (oinume) ◦ https://github.com/oinume ◦ https://x.com/oinume •
2023/10 より Mercari Hallo Software Engineer ◦ 2020まではメルペイに所属 • 好きなGoのパッケージは... moq!! 2
アジェンダ • なぜモックを使うのか • gomockの紹介と課題 • moqによってgomockの課題がどう解消されるか • (gomockやmoqの内部実装については話さない) 3
なぜモックを使うのか • 通常は起こりえないエラーを強制的に発生させたい • ユニットテストでは外部APIを呼び出すとテストが不安定に なるためモックに差し替えたい • etc … 4
gomock • おそらく一番使われているモックライブラリ • github.com/golang/mock として提供されていたが、2023 年6月にアーカイブされたため、Uberによってforkされメン テナンスされている ◦ go.uber.org/mock
• interfaceからモックするためのコードを生成 ◦ mockgen -destination=client.gomock.go -package=github . Client 5
gomockの使用例 6
Sample code - interface定義 7 GitHubのリポジトリのブランチ一覧を取得するListBranches
Sample code - interfaceを使う 8
Sample code - テストでモックする 9
gomockの問題 • 生成されるモックのコードがType Safeではない • 使いこなすためには覚えることが多い 10
gomockの問題 - Type Safeではない • EXPECT を呼び出してモックが期待する挙動を定義する ◦ EXPECTがMockClientMockRecorderを返す ◦
Dive into gomock にわかりやすい説明があるのため詳細は割愛 • しかし、期待値を定義する時に使用するメソッドが以下のように any型を使っておりType Safeではない ◦ func (mr *MockClientMockRecorder) ListBranches(arg0, arg1, arg2 any) ◦ func (c *Call) Return(rets ...any) *Call • このメソッドの引数に何を渡せばいいんだっけ🤔 となりがち ◦ 引数の型を間違えるとテスト実行時にエラーになる 11
gomockの問題 - 覚えることが多い • 「モック対象のメソッドが何回呼ばれたか」を検証するにも 様々な関数がある ◦ Times, MaxTimes, MinTimes,
AnyTimes, etc … • 「期待値が一致しているか」を検証するにも様々な関数があ る ◦ Any, Eq, Nil, Not, Cond, etc … ◦ 詳細は Dive into gomock を...(ry • ユニットテストを書く時にシュッと思い出せない 12
gomock覚えること多過ぎ😇 もう自前でモックコードを書こう💪 13
自前でモックのコードを書く • モックしたいメソッドだけ自分で実装する • interfaceをstructに埋め込んでおけば他のメソッドは実装しなくて済む 14
自前でモックのコードを書く • モックのメソッドが呼ばれているかをチェックしたい • モックのメソッドを呼び出す時の引数をチェックしたい 15 →これらのケースでは都度同じようなコードを書かないといけな い
そんな時にmoqを発見 16
moq • https://github.com/matryer/moq • gomockと同じようにinterfaceからモックを生成するツール ◦ moq -out=client.moq.go . Client
• モックしたいメソッドを自分で実装するだけ • (いまだにどう発音するのが正解かわからない) 17
テストコードでmoqを使う • モックしたいメソッドを自分で実装する • もし実装されていないメソッドが呼ばれるとpanicする • 18
moq - 推し👍ポイント • 生成されるモックのコードがType Safe ◦ gomockのようにany型は登場しない • モック実装は通常の関数を書くだけ
◦ gomockのようにモックのためにAPIを覚える必要はなし • gomockほど多機能ではないが必要最低限の機能はある 19
moq - 最低限の機能 • モックのメソッドが何回呼ばれたか? ◦ len(githubClient.ListBranchesCalls) • メソッドが呼ばれた時の引数の値をチェックしたい ◦
ListBranchesCallsにモック呼び出し時の引数の情報が 入っているので、それを利用 ◦ 実装したモックの関数の中で直接チェックする • gomockのように期待値を検証するための関数はない ◦ 自分で実装する必要あり 20
まとめ • moq はgomockに比べて学習コストが小さい • モックのコードを自前で書いている人にもオススメ • モックコードの中で引数の検証をしっかりとやりたい場合 はgomockの方が適切かも 21
素敵なMock Lifeを😉 22