スタブとモックの違い

はじめに

 以前から「スタブとモックの違いは何だろう?」と思っていたのですが、違いについて触れている書籍を見つけたので、メモ。
 とはいうものの、1Pだけコラムという形で触れているだけですが。

スタブとモックの機能的な相違

 Spring (開発者ノートシリーズ)(2005/7/25、株式会社オーム社、初版)のP84に記述があります。以下に引用します。

スタブは、アプリケーションの実行、テスト、ビルドが容易になるように、アプリケーションをより軽量にしようとします。
(中略)
モックオブジェクトの仕事は、インターフェースの使われ方を測定することです。

 分かるような、分からないような感じですね。

 「モック戦略を使用する際には、3つの手順を踏むことになります」と文章は続いております。
 以下に3つの手順を要約します。意訳をしてみた、とも言います。

No 手順名 説明
1 期待値の設定 モックオブジェクトに対して、メソッドが呼び出されるべき順序を記録します。
その際に、期待される引数、モックオブジェクトのメソッドが返す戻り値も設定します。
2 テスト条件下でのモックオブジェクトの使用 モックオブジェクトを使用したテストを実施します。
3 結果の検証 モックオブジェクトに対し、期待されたとおりにモックオブジェクトが使用されたか問い合わせます。

 スタブとモックの機能的な違いが何となく分かったので、個人的にはすっきりです。

とは言うものの、別の視点による相違の説明も存在する

 このエントリを書く前に、スタブとモックの違いについて検索をするなどしてみたのですが、別の視点による違いの説明も有るようです。

 それは、「状態中心のテストと振る舞い中心のテスト」という視点に基づく説明。
 以下のblogの記述が分かり易かったです。
 「モック/スタブ」と「状態中心/振る舞い中心のテスト」, stubされた元のメソッドの呼び出し - 忘れたときに備えた記録(2008-01-14)

さいごに

 「なぜユニットテストでのスタブは、モックと呼ばれるんだろう?」とか以前は思っていましたが、それなりに相違のあるものだったんですね。