Mockitoを使用したVoidメソッドのモック
1. 概要
この短いチュートリアルでは、Mockitoを使用したvoidメソッドのモックに焦点を当てます。
参考文献:
Mockitoを使用したモック例外のスロー
Mockitoで例外をスローするメソッド呼び出しを構成する方法を学びます。
Mockitoフレームワークに焦点を当てた他の記事(Mockito Verify、Mockito When/Then、Mockito’s Mock Methodsなど)と同様に、以下に示すMyListクラスがテストケースの共同作業者として使用されます。 このチュートリアルに新しいメソッドを追加します。
public class MyList extends AbstractList {
@Override
public void add(int index, String element) {
// no-op
}
}
2. 簡単なモックと検証
VoidメソッドはMockitoのdoNothing(), doThrow(), and doAnswer()メソッドで使用できるため、モックと検証が直感的になります。
@Test
public void whenAddCalledVerified() {
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 whenAddCalledVerified() {
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’s Java 8 Featuresで説明されているように、Answerでラムダを使用してadd()のカスタム動作を定義します。
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つの異なる方法について説明しました。
いつものように、例はthis GitHub projectで利用できます。