スタブ・フェイク・モック

昨日のエントリで定義が曖昧って話があったので、とりあえずネット上を探してみた。モック・スタブは結構見つかりやすいけど、フェイクについては見つからない……
一応めぼしい所だけまとめてみた。

フェイク
フェイクオブジェクトは、実際に動作するように実装されてはいるが、手抜きされているので製品版には向かない。

スタブ
スタブは、テスト時の呼び出しに対して、あらかじめ用意された結果を返す。通常、テスト用にプログラムされたところ以外には応答しない。スタブは呼び出しの情報を記録することもある。例えば、Eメールゲートウェイスタブは「送られた」メッセージを記録するような場合だ。単に「送られた」メールの数を記録する場合もあるだろう。

モック
モックは、エクスペクテーションが事前にプログラムされたものである。エクスペクテーションとは、受信する一連の呼び出しの仕様を表わしたものである。期待されない呼び出しが行なわれた場合は例外をスローする。また、テスト実行後の検証 (verification)で、期待された呼び出しがすべてきちんと行われたかどうかを確認する。

スタブは固定された値しか返さないが、フェイクは値の設定などもできる。
モックについては、テストのために詳細に実装されたオブジェクト、と読むべきなのかな。

フェイク
フェイク オブジェクトには、さまざまなものがあります。このコラムで取り上げているほとんどの例では、スタブを使用しています。
〜(中略)〜
別の種類のフェイクとして、クラス間の相互作用を記録または検証するために使用される "モック" オブジェクトがあります。

スタブ
スタブは、あらかじめ準備された答えと戻り値を提供する単純なオブジェクトです。

モック
モック オブジェクトは、まだ存在しないクラスに対するプレースホルダとして使用します。特に、パブリック インターフェイスが何を行うかを決定するための手段として利用します。


フェイクはスタブとモックの総称。単純な物がスタブ、複雑なものがモックという判断でいいのかな?少しモックの定義が弱い気がするけれど…

ドメイン駆動 (Programmer’s SELECTION)

ドメイン駆動 (Programmer’s SELECTION)

フェイク
固定された値、ハードコードされた値、プログラムが生成した値を返すメソッドを持つクラス。

スタブ
何もしないメソッドを持つクラス。システムをコンパイル、実行できるようにするために作られる。

モック
呼び出されるメソッド、与えられる引数、呼び出しの頻度などについて、期待値を設定できるクラス。さまざまな呼び出し状況にあわせて戻り値を設定できる。また、期待通りになったことをチェックする手段も提供する。

完全な空をスタブ、値が外から設定できないのをフェイク、状況に合わせて自動的に変化するものがモックかな。

フェイク
記述なし

スタブ
スタブ (stub) とは、複数のモジュールからなるコンピュータプログラムの検査(ソフトウェアテスト)時における下位モジュールの代用品のこと。

モック
モックオブジェクト (Mock Object) とは、ソフトウェアテスト時、特にテスト駆動開発、ビヘイビア駆動開発における代用の下位モジュールスタブの一種。スタブと比較して、検査対象のモジュールがその下位モジュールを正しく利用しているかどうかを検証するのに使われる。

スタブは旧来から使われている言葉だけど、同じ意味で使っているっぽいかな。この定義だけだと、スタブは空・もしくは固定データを含み、モックはそれ以上の振る舞いをするオブジェクト、とすべきかな。


自分なりのまとめですが、間違いや「こうじゃないか」という指摘などありましたら、お知らせ下さい。

*1:Thanks id:YokoKen

*2:文の提供はid:bleis-tift