【问题标题】:How can I simplify verification that a method is called with certain parameters and no others?如何简化验证是否使用某些参数而不是其他参数调用方法?
【发布时间】:2013-05-30 11:34:10
【问题描述】:

我需要两张支票

verify(mock).method(any(Object.class));
verify(mock).method(object); // instance of Object...

确保使用特定参数object 只调用一次method,即没有第二次调用method(differentObject) 但是我希望有一种我仍然不知道的简化方法。这不常见吗?

【问题讨论】:

    标签: java unit-testing junit mockito


    【解决方案1】:
     verify(mock).method(object);
     verifyNoMoreInteractions(mock);
    

    如果我没看错,您需要验证模拟被调用了一次且仅一次,并且单个调用的参数等于object(我对您在上面包含any(Object.class) 感到有些困惑)。如果是这样,这很常见,并且上述解决方案效果很好。

    在更复杂的情况下您可以这样做的另一种方法是使用ArgumentCaptor。这将抓取所有调用,并允许您验证是否进行了正确的调用次数并按顺序传递每个参数。

    编辑:将 Jan 的评论/解决方案放在更易读的地方...

    verify(mock, only()).someMethod();
    

    上面的验证和上面verifyverifyNoMoreInteractions这两个调用完全一样。

    为了验证只对方法进行了一次调用(参数匹配)而不对其他方法调用进行任何验证,请尝试...

    verify(mock).method(object);  // verify that there was one call matching
                                  // the expected argument
    verify(mock).method(any(Object.class)); // verify that there only one and only one call
    

    另一种机制是使用建议的ArgumentCaptor

    【讨论】:

    • 我不知道verifyNoMoreInteractions,所以谢谢你的这一课。但是,正如方法的 javadoc 中所述,这太过分了。我想允许任何其他未经验证的呼叫,但不允许method。假设verify(mock).method(any(Object.class)); 不存在并且测试代码调用method(object) || method(differentObject)。那么verify(mock).method(object) 就可以了。只有verify(mock).method(any(Object.class)) 会失败,因为对method 的调用有两个,而不仅仅是一个。 ArgumentCaptor 会比我的解决方案更臃肿。可能这是我想念的最好的。
    • 顺便说一句,我发现verify(mock, only()).someMethod(); 是您解决方案的快捷方式。
    • 我不知道那个。好的。干杯!
    • @Rogério 感谢您的更正。是的,根据 javadocs only 与我最初的建议完全相同。
    • 但是,我在上面最后建议的两次对verify 的调用也应该可以正常工作。
    【解决方案2】:

    据我所知,没有办法简化它。您确实需要编写两个verify(mock).method(...) 调用。唯一的其他方法是使用ArgumentCaptorAnswer,但它们并不简单。

    only() 的使用(如另一个答案中所建议的)不起作用,正如 API documentation 中针对此方法所解释和举例说明的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2018-10-28
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2016-09-20
      相关资源
      最近更新 更多