【问题标题】:How can I verify that a method is called with a parameter that contains a certain value, without verifying the whole parameter?如何验证是否使用包含特定值的参数调用方法,而不验证整个参数?
【发布时间】:2016-11-15 18:04:05
【问题描述】:

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

insertIntoDb(someObjectContainingAListField);

我可以的

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

但这会验证整个对象的内容;我只需要验证列表即可。

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

在 Mockito 中有什么方法可以做到这一点吗?

【问题讨论】:

    标签: unit-testing mockito


    【解决方案1】:

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

    参数捕捉器

    ArgumentCaptor 让您可以在验证过程中获得对该对象的引用,这样您就可以对它做出特定的断言。您可以使用 ArgumentCaptor.forClass 手动创建它们,或者将 @Captor 注释与 MockitoAnnotations 或 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(或匹配器)

    使用 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?

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2018-10-26
      • 2013-01-24
      • 1970-01-01
      相关资源
      最近更新 更多