参考文献

単体テストの考え方 / 使い方 Vladimir Khorikov 著 須田智之 訳。 本記事で引用先を明示していない場合は、上記からの引用です。

関連英単語

馴染のない英単語なので約をメモします。

  • ダブル( double ):代役(米国はスタントをスタントダブル(stunt double)と呼ぶ)1
  • スタブ( stub):切り株、半券

スタブとモック

テストダブルは大きくスタブとモックに分けられるます2

スタブ( Stub )

テストコードに対して、決まった値を返すダミーオブジェクトです。
例:外部 API の代わりに、決まったレスポンスを返す。

スタブの振る舞いを検証してはなりません (p137) 。
スタブの振る舞いは 実装の詳細 のテストのため、リファクタリング耐性を低下させます。

モック( Mock )

モックは呼び出されたかどうかやどのように呼ばれたかなどそれ自体の振る舞いを検証します。
例:外部メールサーバーの呼び出し

モックは外部サービス呼び出し(例:メールサーバー呼び出しや、外部 API を使ったリクエスト)などの外部に向けて副作用が発生する場合に使用します。
スタブとの違いはモックはそれ自体を検証します。

区分 スタブ モック
主目的 値を返す 呼び出しの検証
テスト対象 戻り値の確認 振る舞い(呼び出し)
使用例 API応答の模倣 ログ出力が行われたか検証

モックを使う条件

  1. プロセス外依存
  2. プロセス外依存でもデータベースのように自プロダクトだけからのみ使用するものは除く

※ システム内依存は基本的にモックしない。理由は実装の詳細のテストを避けるためです。実際の詳細をテストすると不必要にフィファクタリングの耐性が弱まります( fall positive が増える)。

  1. double 単体で 2倍 の他に 代役 の意味がある。 

  2. モックはさらにスパイ、スタブはフェイクに分けられます。