📝

【図解】モック・スタブ・スパイ

2024/07/02に公開

概要

単体テストを実施しているとよく耳にする、モック・スタブ・スパイ
今回は用語についてまとめてみました。

これらを総称してテストダブルと呼びます。

引用:https://ja.wikipedia.org/wiki/テストダブル

テストダブル一覧

用語 役割
スタブ テスト対象に「間接的な入力」を提供するために使う。
スパイ テスト対象からの「間接的な出力」を検証するために使う。出力を記録しておくことで、テストコードの実行後に、値を取り出して検証できる。
モック テスト対象からの「間接的な出力」を検証するために使う。テストコードの実行前に、あらかじめ期待する結果を設定しておく。検証はオブジェクト内部で行われる。
フェイク 実際のオブジェクトに近い働きをするが、より単純な実装を使う。実際のデータベースを置き換えるインメモリデータベース、AWSを代替するLocalstackなどが挙げられる。
(ダミー)※厳密な意味でのテストダブルではない テスト対象のメソッドがパラメータを必要としているが、そのパラメータが利用されない場合に渡すオブジェクト。

スタブ(TestStub)

テスト対象から呼び出される依存コンポーネントの返却値を事前に準備する。

スパイ(TestSpy)

テスト対象から呼び出される依存コンポーネントの呼び出し回数・引数などを監視する。

モック(MockObject)

テスト対象から依存コンポーネントを呼び出した出力を記録する。

Q&A

  • 「モック化する」とよく聞くがテストダブルのモックを指している?
    • 本来の定義から逸れるが、モック・スタブ・スパイなどテストダブルを作成することをひっくるめて「モック」と表現することがある。
  • モックとスパイの役割が似てない?
    • モックはテスト前に動作を設定し、その設定通りに動作します。外部コンポーネントがまだ作成されていない場合や、特定の動作を強制的にシミュレートしたい場合に使用されます。
    • スパイは一般的に実際のオブジェクトをラップし、既存のメソッドを呼び出します。

参考

http://xunitpatterns.com/Test Double Patterns.html

Discussion