Mockito验证已经验证的调用

时间:2016-09-22 12:16:26

标签: java mockito

static class Foo {
    public void bar(int i) {}
}

@Test
public void foo() {
    Foo f = Mockito.spy(new Foo());
    f.bar(42);
    Mockito.verify(f, Mockito.times(1)).bar(42);
    f.bar(42);
    Mockito.verify(f, Mockito.times(1)).bar(42);
}

导致org.mockito.exceptions.verification.TooManyActualInvocations(想要1次,但是2次)在最后一行。在调试节目中运行它,InvocationMatcher忽略了第一次调用已经过验证的事实。并且它不依赖于女性确切的匹配器被传递到bar。我做错了什么,或者是Mockito的错误?

1 个答案:

答案 0 :(得分:3)

没有错误。库的实现者认为单个测试方法中的多个调用不是最佳实践。有两种方法可以解决这个问题:

  1. 好的:为每个f.bar()次调用使用单独的测试并单独测试。
  2. 不是很好:在第二次调用之前使用Mockito.reset(f)。它重置了间谍f的状态;例如,如果您插入了doThrow(new Exception).when(f).bar(45)之类的模拟调用,则会在reset()调用后重置。但第二次验证适用于times(1)