私はテストにおけるモックとスタブに関する様々な記事を読みました。マーティン・ファウラーのモックはスタブではない、しかしまだ違いがわかりません。
ベストアンサー1
序文
実在しないオブジェクトには、いくつかの定義があります。一般的な用語はテストダブルです。この用語には、ダミー、フェイク、スタブ、モックが含まれます。
参照
によるとマーティン・ファウラーの記事:
- ダミーオブジェクトは渡されますが、実際には使用されません。通常は、パラメータ リストを埋めるためにのみ使用されます。
- 偽のオブジェクトには実際には動作する実装がありますが、通常は何らかの近道を取るため、本番環境に適していません (メモリ内データベースがその良い例です)。
- スタブは、テスト中に行われた呼び出しに対して定型の応答を提供しますが、通常は、テスト用にプログラムされたもの以外のものにはまったく応答しません。スタブは、呼び出しに関する情報も記録する場合があります。たとえば、電子メール ゲートウェイ スタブは、送信したメッセージ、または送信したメッセージの数だけを記憶します。
- ここで言及しているのはモックです。モックとは、受信することが予想される呼び出しの仕様を形成する期待値で事前にプログラムされたオブジェクトのことです。
スタイル
モック vs スタブ = 動作テスト vs 状態テスト
原理
「テストごとに 1 つのみテストする」という原則によれば、1 つのテストに複数のスタブが存在する可能性がありますが、通常はモックは 1 つだけです。
ライフサイクル
スタブを使用したテストライフサイクル:
- セットアップ - テスト対象のオブジェクトとそのスタブ協力者を準備します。
- 演習 - 機能をテストします。
- 状態を確認する - アサートを使用してオブジェクトの状態を確認します。
- ティアダウン - リソースをクリーンアップします。
モックを使用したライフサイクルのテスト:
- セットアップデータ - テスト対象のオブジェクトを準備します。
- 期待値の設定- プライマリ オブジェクトによって使用されているモックで期待値を準備します。
- 演習 - 機能をテストします。
- 期待値を確認する- モックで正しいメソッドが呼び出されたことを確認します。
- 状態を確認する - アサートを使用してオブジェクトの状態を確認します。
- ティアダウン - リソースをクリーンアップします。
まとめ
モックテストとスタブテストはどちらも、「結果は何ですか?」という質問に対する答えを提供します。
モックを使用したテストでは、結果がどのように達成されたかにも注目します。