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

コメントを残す 0

Your email address will not be published. Required fields are marked *