$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
moq - gomockを使わないMock生成
Search
oinume
June 17, 2024
Programming
0
230
moq - gomockを使わないMock生成
oinume
June 17, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
AIコーディングエージェント(skywork)
kondai24
0
190
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
260
AIコーディングエージェント(Gemini)
kondai24
0
250
Graviton と Nitro と私
maroon1st
0
110
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
140
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
130
Navigation 3: 적응형 UI를 위한 앱 탐색
fornewid
1
380
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
230
複数人でのCLI/Infrastructure as Codeの暮らしを良くする
shmokmt
5
2.3k
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
JETLS.jl ─ A New Language Server for Julia
abap34
2
420
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
870
Featured
See All Featured
Amusing Abliteration
ianozsvald
0
63
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
30
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
27
Testing 201, or: Great Expectations
jmmastey
46
7.8k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
2
3.8k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
0
170
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
30
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
110
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Deep Space Network (abreviated)
tonyrice
0
18
4 Signs Your Business is Dying
shpigford
186
22k
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