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
240
moq - gomockを使わないMock生成
oinume
June 17, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
250
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
460
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
980
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
24時間止められないシステムを守る-医療ITにおけるランサムウェア対策の実際
koukimiura
1
110
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
740
dchart: charts from deck markup
ajstarks
3
1k
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
CSC307 Lecture 02
javiergs
PRO
1
780
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
86
Information Architects: The Missing Link in Design Systems
soysaucechin
0
780
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
190
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
WCS-LA-2024
lcolladotor
0
450
Everyday Curiosity
cassininazir
0
130
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
The World Runs on Bad Software
bkeepers
PRO
72
12k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
100
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
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