logo

モック vs スタブ vs スパイ

モック

モックはメソッド呼び出しを保存するオブジェクトです。これは、テストで使用される依存関係の動的ラッパーと呼ばれます。これは、Java クラス間の対話を記録および検証するために使用されます。モックは、テスト ダブルの最も強力で柔軟なバージョンとして知られています。モックには次のメソッドを使用します。 モック()

モックを使用する主な機能は、モック化されたオブジェクトの動作を完全に制御できることです。モック オブジェクトは通常、次の目的で使用されます。 動作検証 。動作という用語は、オブジェクトに適用される正しいメソッドとパスをチェックすることを意味します。

C++ ペア

モックは主に、ライブラリまたは Mockito、JMock、EasyMock などのモック フレームワークを使用して作成されます。これは、スタブでは不十分な大規模な一連のテストをテストするために使用されます。モックの重要な機能の 1 つは、指定されたメソッドが何回呼び出されたかを検証できることです。

次のコード スニペットは、mock() の使用方法を示しています。

 ToDoService doService = mock(ToDoService.class); 

スタブ

スタブは、事前定義されたデータを保持し、テスト中にそれを使用して応答を返すオブジェクトです。言い換えれば、スタブは、テストに必要な最小限のメソッドを備えた実際のオブジェクトに似たオブジェクトです。スタブは、実際のデータを含む応答を返すオブジェクトを使用したくない場合に使用されます。スタブは最も軽量と呼ばれ、最も静的なバージョンのテストが 2 倍になります。

スタブの主な機能は次のとおりです。

  • 入力に関係なく、常に事前定義された出力を返します。
  • データベース オブジェクトに似せるために使用できます。
  • スタブは、実際のオブジェクトの作成中に発生する複雑さを軽減するために使用されます。主にパフォーマンスに使用されます 状態確認

スパイ

スパイは次のように知られています 部分的にオブジェクトをモックする 。これは、スパイが実際のオブジェクトをスタブまたはスパイすることによって、実際のオブジェクトの部分的なオブジェクトまたは半分のダミーを作成することを意味します。スパイでは、実際のオブジェクトは変更されず、そのオブジェクトの特定のメソッドをいくつかスパイするだけです。言い換えれば、既存の (実際の) オブジェクトを取得し、 交換する または スパイ そのメソッドの一部のみです。

スパイは、メソッドでいっぱいの巨大なクラスがあり、特定のメソッドをモックしたい場合に役立ちます。このシナリオでは、モックやスタブよりもスパイを使用することを優先する必要があります。メソッドがスタブ化されていない場合、実際のメソッドの動作を呼び出します。

Mockito では、spy() メソッドを使用してスパイ オブジェクトを作成します。これにより、実際のオブジェクトの通常のメソッドを呼び出すことができます。次のコード スニペットは、 spy() メソッドの使用方法を示しています。

 List spyArrayList = spy(ArrayList.class); 

スタブとモックの違い

パラメーター スタブ モック
情報元 スタブのデータ ソースはハードコーディングされています。通常、テスト スイートと密接に結合されています。 モック上のデータはテストによって設定されます。
によって作成された スタブは通常手書きですが、ツールによって生成されるものもあります。 モックは通常、Mockito、JMock、WireMock などのサードパーティ ライブラリを使用して作成されます。
使用法 スタブは主に単純なテスト スイートに使用されます。 モックは主に大規模なテスト スイートに使用されます。
グラフィック ユーザー インターフェイス (GUI) スタブには GUI がありません。 モックには GUI があります。

モックとスパイのいくつかの違いを次に示します。

Java トライキャッチ
パラメーター モック スパイ
使用法 モックは、完全にモックまたはダミーのオブジェクトを作成するために使用されます。主に大規模なテストスイートで使用されます。 スパイは、部分的または半分のモック オブジェクトを作成するために使用されます。モックと同様に、スパイも大規模なテスト スイートで使用されます。
デフォルトの動作 モック オブジェクトを使用する場合、メソッドのデフォルトの動作 (スタブ化されていない場合) は何も実行しません (何も実行しません)。 スパイ オブジェクトを使用する場合、メソッドのデフォルトの動作 (スタブ化されていない場合) は、実際のメソッドの動作となります。

これまでのチュートリアルでは、スタブ、モック、およびスパイの例をいくつか説明しました。スタブ、モック、およびスパイの違いをよりよく理解するには、例を参照してください。