モックとスタブの違い モックとスタブの違い

モックとスタブの違い

最初に述べたように、よくモックとスタブは混同される。モックを作るのに使っている各種ツールがスタブを作るのにも申し分なく使えるのだから、混同されるのもよく分かる。ただ、[どちらもツールでオブジェクトを作ることができるが、] 重要なのは、モックとは何か、スタブとは何か、ではなく、それぞれがどのように使われるか、ということだ。

スタブは主に生成したりコントロールしたりするのに手間がかかるオブジェクトをもみ消す [stub out] のに使われる。典型的なのはデータベース接続だろう。[手間のかかるオブジェクトを"もみ消す"ので、] 結果としてスタブを見かけるのは、ほとんどの場合、システムの外部との境界や、システム内の複雑なオブジェクトの塊のあたりだったりすることになる。スタブは、実際のオブジェクトと代替できるようインターフェースの実装をし、実際のメソッドをシンプルな [テスト用に] 準備されたデータを使うメソッドで置き換えることで作られる。

多くの [開発] グループでは、スタブが必要なサービスの全てに対してカスタムスタブを作っているが、数的に多くはないし、大抵複数のテストケースで使い回しされる。よって、汎用的なスタブ定義ライブラリを作る必要はない。とはいっても、スタブを作るのにモックライブラリを使うことはできる。モックライブラリはスタブ作成をちゃんとやってくれる。

テストでの役割からいって、特定のパラメータを渡すメソッドの呼び出しに対して、スタブは予め準備されたデータをただ返すような実装になる。モックのコミュニティの視点からいうと、モックが違うことでキーになるのは、モックのメソッドが呼ばれるテストでの、想定の設定の仕組みだ。モッキスト [=モック主義者] はよく”ただスタブ的に”値を返すようなモックオブジェクトについて述べている。そこで、[スタブと同じように値を返すだけのモックではなく、] テストの中にセットしたモックで想定をテストすることが、モックとスタブの違いを見る一つの方法となる。しかし結局のところ、この方法は [スタブとモックの違いを] ちょっと単純化しすぎている。私は、あるメソッドが呼ばれたらブーリアンの値をセットするといった感じで、想定をチェックするシンプルな手順を行うスタブを作っていたものだ [つまり、モックで行うことをスタブでもできる=モックとスタブの違いはそれほど明確でない]。 しかし、想定はスタブの主な特徴ではないが、モックにとっては最も重要な特徴であるといって差し支えないと考えている。

この記事のタイトル [Mocks Aren't Stubs] にもかかわらず、モックとスタブの違いは本当は一番の問題ではない。最も興味深いのは、相互作用スタイル対状態スタイルというところだ。相互作用中心のテストを行うテスターは全てのサブオブジェクトについてモックを作る。状態中心のテスターは、実際のオブジェクトを使うのが現実的でないものについてのみスタブを作る。例えば、外部サービスやコストのかかるもの、状態中心のやり方では扱いにくいキャッシュのようなものだ。