【もっく】

モック とは?

最終更新:
💡 テストで依存先を代役に替え、呼び出し方などを確かめる

テストで依存先の代わりに使い、呼び出し方などを確認するための代役。用語の分け方は資料やツールによって異なり、代役全体をモックと呼ぶ場合もある。返す値や例外を制御できても、本物の依存先との連携が正しいことまで保証するものではない。

📌 このページのポイント
メール送信先を、テストの代役へ 本物を使う場合 対象の処理 送信先 メール 代役を使うテスト 対象の処理 代役 呼び出しを記録 回数・引数を確認
代役へ送信先を差し替え、呼び出し方などを確認する例。本物のメール送信や、実際の送信先との連携を確認するテストとは対象が異なる。
ひよこ ひよこ
なぜモックを使うの?
ペンギン先生 ペンギン先生
例えばメール送信先を代役へ差し替え、宛先と内容を渡して一度呼んだかを確認できる。本物の送信を避け、想定した結果や例外を返せるよ。ただし差し替えていない依存先まで自動で止まるわけではないんだ。
ひよこ ひよこ
スタブとは違う?
ペンギン先生 ペンギン先生
役割を分ける資料では、スタブは用意した応答を返す代役、モックは期待した呼び出しとの一致を確認する代役だよ。一方、Pythonのunittest.mock.Mockは、返す値の設定も呼び出し記録の検証もできる。使っている資料やツールの意味を確認しよう。
ひよこ ひよこ
テストダブルって何?
ペンギン先生 ペンギン先生
テストの代役全体の総称だよ。Fowlerが紹介する分け方では、ダミーは実際には使わない受け渡し用、フェイクは簡易な動く実装、スタブは用意した応答を返し、スパイはその呼び出し情報も記録する。スパイが必ず本物の処理を実行するという定義ではないんだ。
ひよこ ひよこ
モックがあれば本物とのテストはいらない?
ペンギン先生 ペンギン先生
代役の想定と本物が違えば、代役のテストが通っても連携で失敗するよ。呼び出す側の処理を確認するテストと、実際の相手との受け渡しを確認するテストを組み合わせよう。代役の数だけでテストの良し悪しは決まらないんだ。
ひよこ ひよこ
ライブラリが必要?
ペンギン先生 ペンギン先生
自分で代役を作ることもできるよ。Pythonには標準のunittest.mockがあり、Mockやpatchなどを使える。patchはテスト対象がその名前を参照する場所へ適用する必要がある。どこを差し替えたかを確認して使おう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「モック」って出てきたら「テストで依存先を代役に替え、呼び出し方などを確かめる」と思えばだいたいOK!
📖 おまけ:英語の意味
「Mock」 = 模倣するもの・代役
💬 テストでは本物の代わりに使うものを指すよ。モックという名前だけで、全ての振る舞いが本物と同じだと考えないようにしよう。

参考資料

← 用語集にもどる