私は非常に環境に優しく、一般的なテストの経験があまりなく、モックフレームワークをこれまで使用したことがないという背景でこれを前置きします。
私は、私が嘲笑した多くの異なるWebサービスにヒットするコードの単体テストを書いています。私のテストの多くは、ServiceXへの呼び出しを除いて、すべてのサービス呼び出しが成功した呼び出しの結果を検証します。私の最初の本能は、@ Beforeブロック内のすべてのモックにハッピーパス動作を設定してから、各テストのモック動作を変更することでした。
@Before
public void init(){
when(serviceA.doSomething()).thenReturn(true);
when(serviceB.doSomething()).thenReturn(true);
when(serviceC.doSomething()).thenReturn(true);
when(serviceD.doSomething()).thenReturn(true);
when(serviceE.doSomething()).thenReturn(true);
}
@Test
public void testDoBusinessSuccess(){
String result = businessLogic.doBusiness();
assertThat(result, is("success"));
}
@Test
public void testDoBusinessFailureWhenServiceAFails(){
when(serviceA.doSomething()).thenReturn(false);
String result = businessLogic.doBusiness();
assertThat(result, is("service A is down!"));
}
@Test
public void testDoBusinessFailureWhenServiceBFails(){
when(serviceB.doSomething()).thenReturn(false);
...
これにより、各テストケースが簡潔になり、標準から逸脱した動作のみを指定するため、テスト対象を簡単に確認できます。
しかし、これはMockitoが私にモック動作を設定する方法ではないのではないかと思います。ServiceBでの失敗がServiceCにヒットしないことを意味することを確認しようとしたときにwhen(serviceC.doSomething())
、@Beforeでの呼び出しがserviceCでの呼び出しとしてカウントされることに気づきました。 。つまり、テストケースがserviceCに触れたことがない場合でも、verifyZeroInteractions(serviceC)
電話をかけたために常に失敗しました。when(serviceC.doSomething()).thenReturn(true)
では、ベストプラクティスは何ですか?ほぼ同じ5行をあちこちで繰り返しているとしても、すべてのテストですべてのモックの動作を明示的に設定する方がよいでしょうか。