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
180
moq - gomockを使わないMock生成
oinume
June 17, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
Advanced Micro Frontends: Multi Version/ Framework Scenarios @WAD 2025, Berlin
manfredsteyer
PRO
0
440
AIともっと楽するE2Eテスト
myohei
9
3.1k
Hack Claude Code with Claude Code
choplin
8
2.8k
構文解析器入門
ydah
7
1.8k
PHPカンファレンス関西2025 基調講演
sugimotokei
5
940
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
790
チームで開発し事業を加速するための"良い"設計の考え方 @ サポーターズCoLab 2025-07-08
agatan
1
490
No Install CMS戦略 〜 5年先を見据えたフロントエンド開発を考える / no_install_cms
rdlabo
0
250
可変変数との向き合い方 $$変数名が踊り出す$$ / php conference Variable variables
gunji
0
230
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
40
15k
Android 16KBページサイズ対応をはじめからていねいに
mine2424
0
650
The Niche of CDK Grant オブジェクトって何者?/the-niche-of-cdk-what-isgrant-object
hassaku63
1
690
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
109
19k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
760
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Become a Pro
speakerdeck
PRO
29
5.4k
We Have a Design System, Now What?
morganepeng
53
7.7k
Typedesign – Prime Four
hannesfritz
42
2.7k
4 Signs Your Business is Dying
shpigford
184
22k
Adopting Sorbet at Scale
ufuk
77
9.5k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.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