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

时间:2014-07-02 09:23:19

标签: java unit-testing mockito

我使用Mockito测试的几种方法进行了JUnit测试。我对EasyMock有很多经验(虽然不是最近的)所以我就这样组织了它:

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

@After
public void after() {
    verify(myAPI);
    reset(myAPI);
}

如果需要,方法会在mock上注册一些调用。

但我有一个例外:

  

org.mockito.exceptions.misusing.UnfinishedVerificationException:   缺少方法调用验证(模拟):    - > at de.datev.shared.spdvz.util.UserInfoUtilTest.after(UserInfoUtilTest.java:45)

     

正确验证的示例:       验证(模拟).doSomething()

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

  1. 我必须在每种方法中都这样做
  2. 我必须重复与when
  3. 中使用的相同的论点

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为这是不可能的。 Here是一个古老的讨论,其中两位维护者正在陈述他们对此类功能的看法。 讨论已经很久了,但据我所知,目前的Mockito版本仍然没有支持。

  

在Mockito验证是明确的。所以你基本上验证(断言)   如果某个特定的调用已经发生,那么它已经发生了   你可以选择要检查的重要内容。   Mockito在顽固和嘲弄之间也有更强的分离   功能。因此,它允许您存根一些调用以使代码通过   你想要的路径没有验证呼叫已经发生。   此外,除非您有,否则您没有义务进行子调用   很高兴Mockito为您提供默认值。

     

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

  

关于为什么mockito不能促进验证存根方法的几句话。

     
      
  1. 简化。在过去,当模拟框架广为人知时,我们一直在手写我们的存根。但是我不记得我们想要验证存根实际被调用的单个案例。原因很简单:存根方法被隐式验证:存根值在处理中是必不可少的。

  2.   
  3. 我看到测试中没有分开短路和期待'实际上是有害的。开发人员增加了返回值期望,因为模拟了UnexpectedOperation。但是他没有检查mock返回的值是否真的被使用了...简化存根会使重点变得更有趣:如果正确使用了存根值。

  4.