Mockito:输出与验证的断言

时间:2017-11-09 16:52:12

标签: unit-testing mockito

我一直在编写我的单元测试,大多数时候,我只是断言主题对象返回的输出值是单元测试的,偶尔我会使用验证调用来确保某些方法永远不会调用或调用某些数量的次。

现在,我被代码审查员要求在我正在使用的每个模拟器上添加验证调用,这除了我在输出上的断言之外。你认为,添加这些验证调用是否值得?

1 个答案:

答案 0 :(得分:1)

虽然这很危险地接近于纯粹的意见(因此也是StackOverflow的主题),但你使用了标签,所以我可以回答关于Mockito的设计理念通过Mockito的创始人Szczepan Faber的博客文章证明了这一点,该帖子来自Mockito的课程级文档。

在以下两种情况之一中添加verify次来电:

  1. 它是进行或不进行调用的指定行为的一部分,就像在RPC层上的包装器一样。在这种情况下,外部交互是工作系统的与实现无关的要求,因此使用正确的参数检查正确的调用数是有意义的。
  2. 没有其他用户可见的方法来确定对象的状态。您可以添加一些,但根据对象与环境的交互来推断状态可能会更具设计意义。
  3. 在以下任何一种情况下,您可能都不需要添加verify次调用:

    1. verifyNoMoreInteractions来说,不重要或有明显副作用的来电("Should I worry about the unexpected?" blog post来自Mockito documentation #8
    2. 验证您使用"Asking and telling" blog link中的代码块中的非默认结果(Mockito documentation #2)存根的方法,因为如果存根方法提供必要的测试,测试应该只产生正确的结果数据。
    3. 此处过度验证的风险是测试可能变得脆弱,因此完全合理的实施更改会导致测试失败(即调用不同的方法,或者不调用,或不以相同的顺序调用)。如果高级代码审核员告诉您添加验证,我不会说您无法:这绝对是一个判断调用,您的审核人可能是在实施方面考虑过于防守。但是,请记住,测试的目的是验证实现是否符合promises ,而不是实现在内部以某种方式运行。如果您的验证过于苛刻,可能会导致以后的测试维护困难,同时让您无法接近使用代码。

      作为额外的资源,请参阅Martin Fowler's post "Mocks aren't Stubs",其中描述了各种测试双打(假货,假人,存根,嘲讽)以及与经典状态测试一起使用或代替经典状态测试的一些权衡。< / p>