モッキートの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の例をチェックすることができます。
 
    