我正在测试一个不返回结果的方法。该方法的最后一步是:
insertIntoDb(someObjectContainingAListField);
我能做到
verify(xx).insertIntoDb(eq(someObjectContainingAListField));
但这会验证整个对象的内容;我只需要验证清单。
我真的只想验证它包含的List是否正确。
Mockito有没有办法这样做?
答案 0 :(得分:1)
您有两个主要选择:使用ArgumentCaptor,或编写ArgumentMatcher。
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());
}
使用Mockito ArgumentMatcher或Hamcrest 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?