Mockito ArgumentCaptor,@ Captor注释

时间:2020-02-23 14:40:44  来源:igfitidea点击:

Mockito ArgumentCaptor用于捕获模拟方法的参数。
ArgumentCaptor与Mockito verify()方法一起使用,以获取调用任何方法时传递的参数。
这样,我们可以为测试提供其他JUnit断言。

Mockito ArgumentCaptor

我们可以为任何类创建ArgumentCaptor实例,然后将其capture()方法与verify()方法一起使用。

最后,我们可以从getValue()getAllValues()方法获取捕获的参数。

当我们捕获了一个参数时,可以使用getValue()方法。
如果多次调用验证过的方法,则getValue()方法将返回最新捕获的值。

如果捕获了多个参数,则调用getAllValues()以获取参数列表。

Mockito ArgumentCaptor示例

假设我们有一个定义为的类:

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<Integer> acInteger = ArgumentCaptor.forClass(Integer.class);
	ArgumentCaptor<String> 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<Integer> allValues = acInteger.getAllValues();
	assertEquals(List.of(1, 1), allValues);
	
	verify(mockMathUtils, times(2)).isInteger(acString.capture());
	List<String> allStringValues = acString.getAllValues();
	assertEquals(List.of("1", "999"), allStringValues);
}

Mockito @Captor

我们可以使用@Captor注解在字段级别创建参数捕获器。
因此,与其将字段级别的ArgumentCaptor初始化为:

ArgumentCaptor<Long> acLong = ArgumentCaptor.forClass(Long.class);

我们可以将@Captor用作:

@Captor ArgumentCaptor<Long> acLong;

注意,我们必须在测试方法之前调用MockitoAnnotations.initMocks(this);,以使其由Mockito框架初始化。

Mockito @Captor示例

这是@Captor批注的简单示例。

class MockitoArgumentCaptorExamples {

	@Captor ArgumentCaptor<Long> 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());
	}
}