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

nbp*_*eth 125 java junit unit-testing verify mockito

我正在尝试验证在DAO中调用(void)方法 - 我正在使用一个提交点,该提交点将结果列表发送到该点,重置列表并继续.假设我在列表中有4个东西,并且我的提交点为1,我希望"send"方法被调用4次.我可以通过编写来验证该方法是否被调用一次

Mockito.verify(mock).send()

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

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

就足够了,但它说参数不正确验证.

顺便说一句,如果我 Mockito.verify(mock).send()改为 Mockito.verify(mock.send())或者 Mockito.verify((mock).send())我得到同样的错误.对此的想法?

Tom*_*Tom 215

必要的方法是Mockito#verify:

public static <T> T verify(T mock,
                           VerificationMode mode)
Run Code Online (Sandbox Code Playgroud)

mock是你的嘲笑对象,mode是VerificationMode描述模拟应该如何进行验证.可能的模式是:

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");
Run Code Online (Sandbox Code Playgroud)

您需要从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;
Run Code Online (Sandbox Code Playgroud)

(该类send还提供了上述验证模式.因此您也可以将此类用于静态导入.)

所以在你的情况下,正确的语法将是:

Mockito.verify(mock, times(4)).send()
Run Code Online (Sandbox Code Playgroud)

这将验证该方法VerificationMode是否在模拟对象上调用了4次.如果被调用少于或多于4次,它将失败.


如果你只是想检查,如果方法被调用一次,那么你不需要传递一个verify(mock, times(1)).someMethod("was called once");.一个简单的

verify(mock).someMethod("was called once");
Run Code Online (Sandbox Code Playgroud)

就足够了.它内部使用verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");.

  • 是否有类似“verify(between(m,n))”之类的东西来验证 m 和 n 之间的调用次数? (2认同)
  • @nishant 不,Mockito 似乎不支持这一点,但是您可以使用 `atLeast(M)` 和 `atMost(n)` 多次调用 `verify` 以获得相同的行为。我已经编辑了答案并解释了这一点。 (2认同)