フレームワークのモックでは、オブジェクトをモックしたり、オブジェクトをスパイしたりできます。 2つの違いは何ですか?いつ、どちらを使用するか/使用する必要がありますか?たとえば、mockitoを見ると、スパイとモックを使用して同様のことが行われているように見えますが、両者の違いについてはわかりません。
モックオブジェクトはモックされたクラスを完全に置き換え、記録された値またはデフォルト値を返します。 「薄い空気」からモックを作成できます。これは、単体テストで主に使用されるものです。
スパイすると、既存のオブジェクトを取得し、一部のメソッドのみを「置き換え」ます。これは、巨大なクラスがあり、特定のメソッドのみをモックする場合に役立ちます(部分モッキング)。 Mockitoドキュメント :
実際のオブジェクトのスパイを作成できます。スパイを使用すると、realメソッドが呼び出されます(メソッドがスタブ化されていない場合)。
たとえば、レガシーコードを扱う場合は、実際のスパイを慎重に、ときどき使用する必要があります。
疑わしい場合は、モックを使用してください。
Mockitoは、部分的なモックは良い習慣ではないことを警告しているので、OOアーキテクチャを変更する必要があります。スパイ(または部分的なモック)は、レガシーコードをテストするために推奨されます。
ここで例を使用して説明しようとすることができます。
// difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing(){
List list = new ArrayList();
list.add("abc");
assertEquals(1,list.size());
List mockedList = spy(list);
when(mockedList.size()).thenReturn(10);
assertEquals(10,mockedList.size());
}
ここには、最初の実オブジェクトリストがあり、1つの要素を追加し、サイズが1になると予想していました。
実際のオブジェクトをスパイします。つまり、どのメソッドをスタブ化するかを指示できます。そのため、実際のサイズに関係なく、10を返すスパイオブジェクトでsize-メソッドをスタブすることを宣言しました。
簡単に言うと、実オブジェクトをスパイし、いくつかのメソッドをスタブします。
スパイには2つの定義があります。 1つは、実際のメソッドが呼び出される場所で、もう1つは機能が呼び出されず、nullまたはnullに相当する値のみが返されますが、メソッドが呼び出され、メソッドxがy回呼び出されるなど、状態が記録されます.
リファレンス: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/
モックオブジェクトを使用する場合、スタブでないときのメソッドのデフォルトの動作は何もしません。単純な意味は、そのvoidメソッドの場合、メソッドを呼び出すときに何もしないか、戻り値のあるメソッドがnull、空、またはデフォルト値を返す場合があるということです。
もちろん、スパイオブジェクトでは実際のメソッドであるため、メソッドをスタブ化していない場合は、実際のメソッドの動作を呼び出します。メソッドを変更してモックする場合は、スタブする必要があります。