如何简化使用某些参数而不使用其他参数调用方法的验证?

时间:2013-05-30 11:34:11

标签: java unit-testing junit mockito

我需要两张支票

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

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

2 个答案:

答案 0 :(得分:3)

 verify(mock).method(object);
 verifyNoMoreInteractions(mock);

如果我正确地读了你,你需要验证一次只调用一次模拟,并且单个调用的参数等于object(我对你加入{{1}有点困惑} 以上)。如果是这样,这是非常常见的,上述解决方案效果很好。

在更复杂的情况下,另一种方法是使用any(Object.class)。这将获取所有调用,并允许您验证是否进行了正确的调用次数,并按顺序传递每个参数。

编辑:将Jan的评论/解决方案放在哪里更具可读性......

ArgumentCaptor

上述验证与上述verify(mock, only()).someMethod(); verify的两次调用完全相同。

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

verifyNoMoreInteractions

另一种机制是使用建议的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

答案 1 :(得分:1)

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

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