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