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());
}
}

