モックとスタブ

前から、常々 EasyMock によるモックオブジェクトを利用したテストを行なっていて、不満だった点があります。
それは、複数種類の入力(引数)に対する動作(戻り値or例外送出)を設定できないことです。
例えば、引数の値が A である場合は X を戻り値として返し、B の場合は Y を戻り値として返す、といったような設定が行なえません。このようなことを実現したい場合は、EasyMock を使用するよりも、自分でダミーのクラスを作成してしまった方が簡単だったりします。

EasyMock で、上記のようなことが行なえないのを不満に思っていたのですが、ファウラータンのブログエントリを読んで、納得しました。

  • ダミーオブジェクト は、受け渡されることはあるが実際に使用されることはない。パラメータリストを埋めたいだけといった場合に利用されることが多い。
  • フェイクオブジェクト は実際に動作するよう実装されてはいるが、手抜きがされているので製品版には向かない(メモリ内データベースが良い例である)。
  • スタブ はテスト時の呼び出しに対して、あらかじめ用意された結果を返す。通常、テスト用にプログラムされたところ以外には応答しない。スタブは呼び出しの情報を記録することもある。例えば、Eメールゲートウェイスタブは「送られた(とされる)」メッセージを記録するような場合だ。単に「送られた(とされる)」メールの数を記録する場合もあるだろう。
  • モック は、エクスペクテーションが事前にプログラムされている。エクスペクテーションとは受信されることが期待されている一連の呼び出しのことで、仕様を表わしている。期待されない呼び出しが行なわれた場合は例外をスローする。また、テスト実行後の検証 (verification)で、期待された呼び出しがすべてきちんと行われたかどうかが確認される。

EasyMock は「モック」を作るためのライブラリなので、そもそも「スタブ」のような使い方は想定していないと思われます。むしろ、「モック」が「スタブ」の役割まで担ってしまったら、なんでもかんでも詰め込みすぎで分かりづらいクラスになっていたと思います。
と、いうことで、EasyMock はむしろよく出来た設計だと思ったり。