如何在不验证整个参数的情况下验证是否使用包含特定值的参数调用方法?

时间:2016-11-15 18:04:05

标签: unit-testing mockito

我正在测试一个不返回结果的方法。该方法的最后一步是:

insertIntoDb(someObjectContainingAListField);

我能做到

verify(xx).insertIntoDb(eq(someObjectContainingAListField));

但这会验证整个对象的内容;我只需要验证清单。

我真的只想验证它包含的List是否正确。

Mockito有没有办法这样做?

1 个答案:

答案 0 :(得分:1)

您有两个主要选择:使用ArgumentCaptor,或编写ArgumentMatcher。

ArgumentCaptor

ArgumentCaptor允许您在验证过程中获得对象的引用,因此您可以对其进行特定的断言。您可以使用ArgumentCaptor.forClass手动创建它们,或者使用带有MockitoAnnotations的@Captor注释或Mockito Runner或Rule。

@Captor ArgumentCaptor<ListFieldContainer> listFieldContainerCaptor;

@Test public void yourTest() {
  yourClass.doSomething();
  verify(mockService).insertIntoDb(listFieldContainerCaptor.capture());
  ListFieldContainer listFieldContainer = listFieldContainerCaptor.getValue();
  assertEquals(3, listFieldContainer.getListField().size());
}

ArgumentMatcher(或Matcher)

使用Mockito ArgumentMatcherHamcrest Matcher,您可以创建一个代表您正在寻找的谓词的对象。

@Test public void yourTest() {
  yourClass.doSomething();
  verify(mockService).insertIntoDb(argThat(
      new ArgumentMatcher<ListFieldContainer>() {
        @Override public boolean matches(ListFieldContainer container) {
          return (container.size() == 3);
        }
      });
}

请注意,以前版本的Mockito直接依赖于Hamcrest,因此Matchers.argThat使用了Hamcrest匹配器;较新版本的Mockito使用ArgumentMatchers.argThat来获取类似Hamcrest的ArgumentMatcher接口和MockitoHamcrest.argThat以适应适当的Hamcrest匹配器。

另请参阅:Mockito - how to mock/verify a method call which accepts a new object?

相关问题