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プロジェクト]にあります。