5

私は非常に環境に優しく、一般的なテストの経験があまりなく、モックフレームワークをこれまで使用したことがないという背景でこれを前置きします。

私は、私が嘲笑した多くの異なる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行をあちこちで繰り返しているとしても、すべてのテストですべてのモックの動作を明示的に設定する方がよいでしょうか。

4

3 に答える 3

2
when(serviceC.doSomething()) in the @Before counted as invocations on serviceC

whenそれは単なるスタブであるため、構造が呼び出しとして扱われるとは思えません。
コードを再確認して、serviceC.doSomethingがあなたの内部から呼び出されているかどうかを確認できますか@Test

ベスト プラクティスに関しては、すべてのテスト ケースに共通するスタブ動作のみを移行する必要があると思います。@Before

Chain of Responsibilityコードがどのように見えるかは別として、パターンへのリファクタリングを試すことができると思います。これは、テスト コードのコーディングに役立つはずです。

于 2012-10-25T04:42:21.020 に答える
0

これはモッキングに固有のものではありませんが、すべての junit テストの前に実行されるため、すべてのテストに共通のコードのみを @Before に入れる必要があります。

したがって、テストに固有の動作が必要な場合は、すべてのモックをそれらのテストに含める必要があります。

複数のテストに共通の動作がある場合は、その動作を必要とするテストのみによって呼び出されるメソッドにそれを抽出できます。

于 2012-10-25T04:39:15.470 に答える
0

カウントされている呼び出しverifyは、テスト メソッド自体の呼び出しです。each メソッドの呼び出しを次のように変更します。

doReturn(false).when(serviceA).doSomething();

これは、何がスタブ化されるかという点で、あなたがしていることと同じ効果があります。doSomethingただし、検証目的での呼び出しとしてはカウントされません。

于 2012-10-25T16:36:34.063 に答える