如何验证使用包含特定值的参数调用方法,而不验证整个参数? [英] How can I verify that a method is called with a parameter that contains a certain value, without verifying the whole parameter?

查看:65
本文介绍了如何验证使用包含特定值的参数调用方法,而不验证整个参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在测试一种不返回结果的方法.该方法的最后一步类似于:

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 ArgumentMatcherHamcrest 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆