現在、コントローラー メソッドをテストする Spring MVC アプリケーションで、Mockito を使用してサービス レイヤー オブジェクトをモック化しているところです。
しかし、Mockito の詳細を読んでいくうちに、 メソッドはdoReturn(...).when(...)
と同等であることがわかりましたwhen(...).thenReturn(...)
。
そこで私の質問は、同じことを行う 2 つの方法を持つことの意味は何か、あるいは 2 つの方法の微妙な違いは何なのかということです。
ベストアンサー1
@Spy
モック ( で注釈が付けられている) の代わりにスパイされたオブジェクト ( で注釈が付けられている) を使用する場合、両方のアプローチの動作は異なります@Mock
。
when(...) thenReturn(...)
指定された値が返される直前に実際のメソッド呼び出しを行います。そのため、呼び出されたメソッドが例外をスローした場合は、それを処理したり、モック化したりする必要があります。もちろん、結果は得られます(で定義したものthenReturn(...)
)。doReturn(...) when(...)
メソッドをまったく呼び出しません。
例:
public class MyClass {
protected String methodToBeTested() {
return anotherMethodInClass();
}
protected String anotherMethodInClass() {
throw new NullPointerException();
}
}
テスト:
@Spy
private MyClass myClass;
// ...
// would work fine
doReturn("test").when(myClass).anotherMethodInClass();
// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");