Mockitoを使った無効なメソッド

1概要

この短いチュートリアルでは、Mockitoを使って void メソッドをモックすることに焦点を当てます。

Mockitoフレームワークに焦点を当てた他の記事と同様に( Mockito Verify Mockito When/Then 、および Mockitoのモックメソッド など)。以下に示す MyList クラスは、テストケースで共同作業者として使用されます。このチュートリアルに新しいメソッドを追加します。

public class MyList extends AbstractList<String> {

    @Override
    public void add(int index, String element) {
       //no-op
    }
}

** 2単純なモッキングと検証

Void メソッドは、Mockitoの doNothing()、doThrow()、およびdoAnswer() メソッドと一緒に使用することができます。

@Test
public void whenAddCalledVerfied() {
    MyList myList = mock(MyList.class);
    doNothing().when(myList).add(isA(Integer.class), isA(String.class));
    myList.add(0, "");

    verify(myList, times(1)).add(0, "");
}

ただし、 doNothing() は、voidメソッドに対するMockitoのデフォルトの動作です。

このバージョンの whenAddCalledVerified() は、上記のものと同じことを実現します。

@Test
public void whenAddCalledVerfied() {
    MyList myList = mock(MyList.class);
    myList(0, "");

    verify(myList, times(1)).add(0, "");
}

DoThrow() は例外を生成します。

@Test(expected = Exception.class)
public void givenNull__AddThrows() {
    MyList myList = mock(MyList.class);
    doThrow().when(myList).add(isA(Integer.class), isNull());

    myList.add(0, null);
}

下記の doAnswer() について説明します。

3引数のキャプチャ

デフォルトの動作を doNothing() でオーバーライドする1つの理由は、引数を取り込むことです。

上記の例では verify() add() に渡された引数をチェックするために使用されます。

しかし、私たちは議論を捉え、それらを使ってもっと何かをする必要があるかもしれません。このような場合は、上記と同じように doNothing() を使用しますが、 ArgumentCaptor を使用します。

@Test
public void whenAddCalledValueCaptured() {
    MyList myList = mock(MyList.class);
    ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class);
    doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
    myList.add(0, "captured");

    assertEquals("captured", valueCapture.getValue());
}

4 Void への電話に出る

メソッドは、単に値を追加または設定するよりも複雑な動作を実行することがあります。このような状況では、Mockitoの Answer を使用して必要な動作を追加できます。

@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer((Answer) invocation -> {
        Object arg0 = invocation.getArgument(0);
        Object arg1 = invocation.getArgument(1);

        assertEquals(3, arg0);
        assertEquals("answer me", arg1);
        return null;
    }).when(myList).add(any(Integer.class), any(String.class));
    myList.add(3, "answer me");
}

/mockito-2-java-8[MockitoのJava 8の機能]で説明されているように、 add() のカスタム動作を定義するために Answer でラムダを使用します。

5部分モッキング

部分モックもオプションです。 Mockitoの doCallRealMethod() void メソッドに使用できます。

@Test
public void whenAddCalledRealMethodCalled() {
    MyList myList = mock(MyList.class);
    doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
    myList.add(1, "real");

    verify(myList, times(1)).add(1, "real");
}

これにより、実際に呼び出されたメソッドを呼び出して同時に検証することができます。

6. 結論

この簡単なチュートリアルでは、Mockitoでテストするときに void メソッドにアプローチするための4つの異なる方法について説明しました。

いつものように、例はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/mockito[このGitHubプロジェクト]にあります。