テストダブル、モック、スタブ、スパイ、フェイク、ダミーとは?違いは?
この記事は書籍である「単体テストの考え方/使い方」を参考にして記載しています。
図でイメージを掴もう
テストでしか使われない偽りの依存として表現されるものを包括してテスト・ダブルといいます。
さらにテスト・ダブルの中に大きくモックとスタブというグループがいて、モックグループの中にモックとスパイ、スタブグループの中にスタブ、ダミー、フェイクがいます。
注意点
モックをテスト・ダブルという意味で使うことがあります。あとテスト用のライブラリではspyとかmockを利用した場合に、ここの説明とは異なって利用される場合もあります。
モックとは?
テスト対象が外部に対して正しい出力をしているかどうかを確認する時に使われます。例えばテスト対象が期待通りログ出力できているか、メール送信ができているかなどが挙げられます。外部に向かうコミュニケーションを模倣し、検証するのに使われます。
スタブとは?
テスト対象が外部から正しい入力がされているかどうかを確認する時に使われます。例えばデータベースからデータを取得するなどです。内部に向かうコミュニケーションを模倣するのに使われます。
スパイとは?
モックというグループの中にモックとスパイが存在しています。モックでは依存先を模倣したものを利用しますが、スパイでは依存先を実際に使います。
例えばmethodA
、methodB
を持つClassA
があった場合にスパイの場合はClassA
をそのまま利用してmethodA
だけ挙動を変えることができます。モックはClassA
を模倣したMockClassA
を作成してmethodA
の振る舞いを設定します。そのためモックはmethodB
に振る舞いを設定していない場合は何も実行されず、設定していないメソッドをテストで動かすとエラーになったります。スパイはClassA
をそのまま使っているので、methodB
に何も設定していない場合は実際のClassAのmethodB
がそのまま動きます。
ダミーとは?
スタブというグループの中にダミーがいます。nullや固定文字列といったハードコーディングで値を返すことです。
スタブとは?
スタブというグループの中にスタブがいます。設定によって返す結果を変えることができます。例えば引数に3が来たら戻り値は10を返すような設定ができます。
フェイクとは
スタブというグループの中にフェイクがいます。依存を置き換えるために利用されます。FakeDaoのようにクラスごと置き換えられるイメージです。
Discussion