如何验证Mockito中的所有方法调用?

Dan*_*lor 5 java unit-testing mockito

我有一个使用Mockito测试的几种方法的JUnit测试。我在EasyMock方面有相当丰富的经验(尽管不是最近),所以我这样组织它:

@Before
public void before() {
    myAPI = mock(MyAPI.class);
}

@After
public void after() {
    verify(myAPI);
    reset(myAPI);
}
Run Code Online (Sandbox Code Playgroud)

如果需要,这些方法会在模拟中注册一些调用。

但是我有一个例外:

org.mockito.exceptions.misusing.UnfinishedVerificationException:在此处缺少对verify(mock)的方法调用:-> de.datev.shared.spdvz.util.UserInfoUtilTest.after(UserInfoUtilTest.java:45)

正确验证的示例:verify(mock).doSomething()

我知道我可以做,verify(myAPI).doSomething(someArgs)但是:

  1. 我必须在每种方法中都要做
  2. 我必须重复与在 when

是否有任何方法可以简单地进行验证,如果所有注册的方法都已when被实际调用?EasyMock以这种方式工作,非常方便。

Laz*_*ass 5

我认为这是不可能的。 是一个古老的讨论,其中两位维护者表达了他们对此类功能的看法。这个讨论已经很老了,但据我所知,当前的 Mockito 版本仍然不支持这一点。

在 Mockito 中,验证是明确的。因此,您基本上验证(断言)特定调用是否已经发生,并且由您选择要检查的重要内容。Mockito 在存根和模拟功能之间也有更强的分离。因此,它可以让您存根一些调用,使代码通过您想要的路径,而无需验证调用是否已发生。此外,除非您对 Mockito 提供的默认值感到满意,否则您没有义务进行子调用。

这种方法将测试设置逻辑与测试验证分开,更好地提高了可读性。

关于为什么mockito不提倡验证存根方法的几句话。

  1. 简化。回到过去,当模拟框架还广为人知时,我们一直在手写我们的存根。但我不记得有任何一个案例我们想要验证存根是否确实被调用。原因很简单:存根方法是隐式验证的:因为存根值在处理中至关重要。

  2. 我看到一些测试,没有将存根和“期望”分开实际上是有害的。开发人员添加了返回值期望,因为模拟因 UnexpectedOperation 尖叫。但他没有检查mock返回的值是否被实际使用...简化存根将重点放在更有趣的事情上:存根值是否被正确使用。


Pet*_*erg 0

如果我有很多完全相同的调用,只需使用 commonMocking 方法,将验证放在那里并在需要时重用它。然后我将验证保留在实际测试中 - 这使得每个测试用例之间的实际差异更具可读性。