Java使用Mockito验证void方法调用n次


140

我试图验证在DAO中是否正在调用(void)方法-我正在使用提交点,该发送点发送直到该点的结果列表,重置列表并继续。假设我在列表中有4件事,并且我的提交点为1,我希望“发送”方法被调用4次。我可以通过编写来验证该方法是否被调用过一次

Mockito.verify(mock).send()

它通过了..但是我想验证它被调用的次数。我认为

Mockito.verify(mock.send(), times(4))

就足够了,但是它说参数对于验证不正确。

顺便说一句,如果我更改 Mockito.verify(mock).send()Mockito.verify(mock.send())Mockito.verify((mock).send())得到相同的错误。有这个想法吗?


10
尝试Mockito.verify(mock, times(4)).send()。我想知道为什么您“移动”了send()方法内部的verify方法调用。您已经有了正确的语法。
2015年


另请注意,如果您不在乎被呼叫的次数,则可以编写verify(mock, atLeastOnce()).send();
Dawood ibn Kareem,2015年

谢谢,是正确的。我发现令人困惑的是Mockito.verify(mock).send()通过了,但是仅仅封装它就导致了一个错误,该错误什么也没有改变。但是,这是一个胜利!
nbpeth 2015年

Answers:


237

必要的方法是Mockito#verify

public static <T> T verify(T mock,
                           VerificationMode mode)

mock是您的模拟对象,它modeVerificationMode描述如何验证模拟的对象。可能的模式是

verify(mock, times(5)).someMethod("was called five times");
verify(mock, never()).someMethod("was never called");
verify(mock, atLeastOnce()).someMethod("was called at least once");
verify(mock, atLeast(2)).someMethod("was called at least twice");
verify(mock, atMost(3)).someMethod("was called at most 3 times");
verify(mock, atLeast(0)).someMethod("was called any number of times"); // useful with captors
verify(mock, only()).someMethod("no other method has been called on the mock");

您需要从Mockito类中进行以下静态导入,才能使用verify方法和以下验证模式:

import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

因此,在您的情况下,正确的语法将是:

Mockito.verify(mock, times(4)).send()

这验证了该方法在模拟对象上send被调用了4次。如果调用次数少于或超过4次,它将失败。


如果您只想检查方法是否被调用过一次,则无需传递VerificationMode。一个简单的

verify(mock).someMethod("was called once");

足够了。它在内部使用verify(mock, times(1)).someMethod("was called once");


可以在同一模拟上进行多个验证调用,以实现“之间”验证。Mockito不支持这样的东西verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");,但是我们可以写

verify(mock, atLeast(4)).someMethod("was called at least four times ...");
verify(mock, atMost(6)).someMethod("... and not more than six times");

相反,获得相同的行为。包括边界,因此当方法被调用4次,5次或6次时,测试用例为绿色。


1
对于想要查找VerificationMode方法位置的用户(用于静态导入或显式引用),它们位于中org.mockito.internal.verification.VerificationModeFactory
史蒂夫·钱伯斯

verify(mock, atLeast(0)).someMethod("was called any number of times");有助于忽略通话验证
tj-

2
是否有类似的东西verify(between(m,n))可以验证m和n之间的通话次数?
取消

2
@nishant没有,似乎的Mockito不支持这一点,但你可以调用verify与时代atLeast(M)atMost(n)获得相同的行为。我已经编辑了答案,解释了这一点。
汤姆(Tom)

@KevinWelker是的,我删除了有关的信息VerificationModeFactory。最新版本仍然可用,但是我同意不应使用内部类。
汤姆(Tom)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.