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
93
moq - gomockを使わないMock生成
oinume
June 17, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
Beyond the RuboCop Defaults
koic
2
480
CSC509 Lecture 02
javiergs
PRO
0
150
Removing Corepack
yosuke_furukawa
PRO
9
1.1k
Flutterアプリを生成AIで生成する勘所
rizumita
0
240
ACES Meet におけるリリース作業改善の取り組み
fukucheee
0
110
5年分のツケを一気に払った話
soogie
3
970
ファーストペンギンBot @Qiita Hackathon 2024 予選
dyson_web
0
200
Modern Functional Fluent CFML REST by Luis Majano
ortus24
0
110
RemixとCloudflare Stack におけるFile Upload
ossamoon
1
120
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
180
Micro Frontends for Java Microservices - dev2next 2024
mraible
PRO
0
180
Cloud Adoption Frameworkにみる組織とクラウド導入戦略(縮小版)
tomokusaba
1
120
Featured
See All Featured
Facilitating Awesome Meetings
lara
49
6k
Docker and Python
trallard
40
3k
Designing the Hi-DPI Web
ddemaree
279
34k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
48k
Web development in the modern age
philhawksworth
205
10k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
30
2.6k
Atom: Resistance is Futile
akmur
261
25k
No one is an island. Learnings from fostering a developers community.
thoeni
19
2.9k
How GitHub Uses GitHub to Build GitHub
holman
473
290k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
158
15k
Making the Leap to Tech Lead
cromwellryan
130
8.8k
Unsuck your backbone
ammeep
667
57k
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