モッキートのArgumentCaptor、@Captorアノテーション
MockitoのArgumentCaptorは、モックメソッドの引数をキャプチャするために使用されます。ArgumentCaptorは、任意のメソッドが呼び出された際に渡される引数を、Mockitoのverify()メソッドと一緒に使用します。これにより、テストに追加のJUnitアサーションを提供することができます。
モッキートのArgumentCaptor
私たちはどんなクラスでもArgumentCaptorのインスタンスを作成することができます。その後、そのインスタンスのcapture()メソッドをverify()メソッドと一緒に使用します。最後に、getValue()メソッドとgetAllValues()メソッドからキャプチャされた引数を取得することができます。getValue()メソッドは、単一の引数をキャプチャした場合に使用することができます。検証されたメソッドが複数回呼び出された場合、getValue()メソッドは最後にキャプチャされた値を返します。複数の引数がキャプチャされた場合は、getAllValues()を呼び出して引数のリストを取得してください。
モキート引数キャプチャの例
「仮に私たちに以下のような定義されたクラスがあるとしましょう:」
class MathUtils {
public int add(int x, int y) {
return x + y;
}
public boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
}
return true;
}
public long squareLong(long l) {
return l*l;
}
}
以下のように、テストケースを書いてArgumentCaptorを使用することができます。
@Test
void test() {
MathUtils mockMathUtils = mock(MathUtils.class);
when(mockMathUtils.add(1, 1)).thenReturn(2);
when(mockMathUtils.isInteger(anyString())).thenReturn(true);
ArgumentCaptor acInteger = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor acString = ArgumentCaptor.forClass(String.class);
assertEquals(2, mockMathUtils.add(1, 1));
assertTrue(mockMathUtils.isInteger("1"));
assertTrue(mockMathUtils.isInteger("999"));
verify(mockMathUtils).add(acInteger.capture(), acInteger.capture());
List allValues = acInteger.getAllValues();
assertEquals(List.of(1, 1), allValues);
verify(mockMathUtils, times(2)).isInteger(acString.capture());
List allStringValues = acString.getAllValues();
assertEquals(List.of("1", "999"), allStringValues);
}
モッキートの@Captor
私たちは、@Captorアノテーションを使用してフィールドレベルで引数のキャプチャを作成することができます。したがって、フィールドレベルのArgumentCaptorを初期化する代わりに:
ArgumentCaptor acLong = ArgumentCaptor.forClass(Long.class);
私たちは、@Captorを以下のように使用することができます。
@Captor ArgumentCaptor acLong;
モックitoフレームワークで初期化するために、テストメソッドの前にMockitoAnnotations.initMocks(this)を呼び出す必要があることに注意してください。
モキートの @Captor の例
ここに@Captorアノテーションの簡単な例があります。
class MockitoArgumentCaptorExamples {
@Captor ArgumentCaptor acLong;
@Test
void test() {
MathUtils mockMathUtils = mock(MathUtils.class);
when(mockMathUtils.squareLong(2L)).thenReturn(4L);
assertEquals(4L, mockMathUtils.squareLong(2L));
verify(mockMathUtils).squareLong(acLong.capture());
assertTrue(2 == acLong.getValue());
}
}
私たちのGitHubリポジトリから完全なコードやさらに多くのMockitoの例をチェックすることができます。