Mockito ArgumentCaptor、@Captor 注释

Mockito ArgumentCaptor 用于捕捉嘲笑方法的论点. ArgumentCaptor 与 Mockito verify() 方法一起使用,以便在任何方法被调用时通过论点。

论 论 论

我们可以为任何类创建ArgumentCaptor实例,然后使用其capture()方法与verify()方法一起使用。最后,我们可以从getValue()getAllValues()方法中获取被捕获的参数。当我们捕获了单个参数时,可以使用getValue()方法。

马克思 论点 例子

假设我们有一个定义为:

 1class MathUtils {
 2    public int add(int x, int y) {
 3    	return x + y;
 4    }
 5
 6    public boolean isInteger(String s) {
 7    	try {
 8    		Integer.parseInt(s);
 9    	} catch (NumberFormatException e) {
10    		return false;
11    	}
12    	return true;
13    }
14    
15    public long squareLong(long l) {
16    	return l*l;
17    }
18}

我们可以编写我们的测试案例,并使用如下所示的 ArgumentCaptor。

 1@Test
 2void test() {
 3    MathUtils mockMathUtils = mock(MathUtils.class);
 4    when(mockMathUtils.add(1, 1)).thenReturn(2);
 5    when(mockMathUtils.isInteger(anyString())).thenReturn(true);
 6
 7    ArgumentCaptor acInteger = ArgumentCaptor.forClass(Integer.class);
 8    ArgumentCaptor acString = ArgumentCaptor.forClass(String.class);
 9
10    assertEquals(2, mockMathUtils.add(1, 1));
11    assertTrue(mockMathUtils.isInteger("1"));
12    assertTrue(mockMathUtils.isInteger("999"));
13
14    verify(mockMathUtils).add(acInteger.capture(), acInteger.capture());
15    List allValues = acInteger.getAllValues();
16    assertEquals(List.of(1, 1), allValues);
17    
18    verify(mockMathUtils, times(2)).isInteger(acString.capture());
19    List allStringValues = acString.getAllValues();
20    assertEquals(List.of("1", "999"), allStringValues);
21}

莫克蒂奥·卡普特

我们可以使用@Captor注释来创建字段级的参数采集器,因此,而不是将字段级的ArgumentCaptor初始化为:

1ArgumentCaptor acLong = ArgumentCaptor.forClass(Long.class);

我们可以使用 @Captor 作为:

1@Captor ArgumentCaptor acLong;

请注意,我们必须在测试方法之前拨打MockitoAnnotations.initMocks(this);以便通过Mockito框架进行初始化。

莫克蒂托 @Captor 例子

以下是 @Captor 注释的一个简单示例。

 1class MockitoArgumentCaptorExamples {
 2
 3    @Captor ArgumentCaptor acLong;
 4
 5    @Test
 6    void test() {
 7    	MathUtils mockMathUtils = mock(MathUtils.class);
 8    	when(mockMathUtils.squareLong(2L)).thenReturn(4L);
 9    	assertEquals(4L, mockMathUtils.squareLong(2L));
10    	verify(mockMathUtils).squareLong(acLong.capture());
11    	assertTrue(2 == acLong.getValue());
12    }
13}

您可以从我们的 GitHub 存储库查看完整的代码和更多 Mockito 示例。

Published At
Categories with 技术
Tagged with
comments powered by Disqus