如何验证使用包含特定值的参数调用方法,而不验证整个参数? [英] How can I verify that a method is called with a parameter that contains a certain value, without verifying the whole parameter?
问题描述
我正在测试一种不返回结果的方法.该方法的最后一步类似于:
I am testing a method that returns no results. The last step of the method is something like:
insertIntoDb(someObjectContainingAListField);
我可以做到
verify(xx).insertIntoDb(eq(someObjectContainingAListField));
但这会验证整个对象的内容;我只需要验证列表.
But that would verify the entire object contents; I only need to verify the list.
我真的只想验证它包含的 List 是否正确.
I really only want to verify that the List it contains is correct.
在 Mockito 中有没有办法做到这一点?
Is there any way to do so in Mockito?
推荐答案
您有两个主要选择:使用 ArgumentCaptor,或编写 ArgumentMatcher.
You have two main choices: Use an ArgumentCaptor, or write an ArgumentMatcher.
ArgumentCaptor作为验证的一部分,您可以获取对对象的引用,然后您可以对其进行特定的断言.您可以使用 ArgumentCaptor.forClass 手动创建它们,或者使用带有 MockitoAnnotations 或 Mockito Runner 或 Rule 的 @Captor 注释.
ArgumentCaptor lets you get a reference to the object as part of your verification, so then you can make specific assertions about it. You can create them manually with ArgumentCaptor.forClass, or use the @Captor annotation with MockitoAnnotations or the Mockito Runner or 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(或匹配器)
使用 Mockito ArgumentMatcher 或 Hamcrest Matcher,您可以创建一个表示您正在寻找的谓词的对象.
ArgumentMatcher (or Matcher)
Using a Mockito ArgumentMatcher or a Hamcrest Matcher, you can create an object that represents the predicate you're looking for.
@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 匹配器.
Note that previous versions of Mockito relied directly on Hamcrest, such that Matchers.argThat took a Hamcrest matcher; newer versions of Mockito use ArgumentMatchers.argThat to take a Hamcrest-like ArgumentMatcher interface and MockitoHamcrest.argThat to adapt a proper Hamcrest matcher.
另见:Mockito - 如何模拟/验证接受新对象的方法调用?
这篇关于如何验证使用包含特定值的参数调用方法,而不验证整个参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!