2016-11-14 68 views
1

我很努力地知道如何确定我的测试对象与什么对象交互应该被嘲弄。我应该模拟我的测试对象与之交互的所有对象吗?

class MyClass { 
    private Customer customer; 
    private Invoice invoice; 
    private PrintService ps; 
    private DBAccessService da; 
    private EmailService em; 
    .......... 
} 

我可以看到最后3个被嘲笑,因为他们处理一些外部系统。客户和发票怎么样?如果不是,为什么?

+0

一个测试策略是首先测试较低级别的对象/图层,然后使用这些测试对象来测试较高级别的图层。如果你觉得这样比较好(根据你的设计和你的要求),那么这对你来说可能是最好的策略。你不必嘲笑一切。 – markspace

+0

关于这个问题没有完全的共识。这是说得很温和,有关于它的激烈争论。无论您选择什么路径,都要记住自动测试的目的是:尽可能以最短的时间尽可能在最短的时间内找出错误。或者转过来:建立对代码正确性的信心。这就是关键所在。 – biziclop

回答

4

这个问题的一般答案是“我应该模拟我的测试对象与之交互的所有对象吗?”是一个响亮的:这不是你应该内化或遵循的规则。嘲笑是多种测试类型中的一种,你必须对使用嘲笑的地方,使用其他赝品或测试双打的地点以及使用真正的合作者的地点进行判断。我同意你的决定,即最后三个字段(服务)可能值得嘲弄,如果它取决于我,我会使用前两个字段(Customer和Invoice)的实际对象。

在这里,我会坚持的指导方针,别拿数据对象,从几个观察其如下:

  • 数据对象往往是非常有状态,并嘲讽框架往往存根状态不好。 Mockito实际上没有一个很好的语法“getX无限期返回15,直到您拨打setX(20),然后getX返回20”。因此,正确剔除通常很困难。

  • 对于只是字段/获取者/设置者的数据对象,验证无法通过读取实际实现中的可变状态来完成。谁在乎是否调用了getY,只要读取对象中的值?谁在乎setY被调用了多少次,只要正确的值结束在对象中?因此,验证通常是不必要的。

  • 数据对象通常写在使用它们的对象之前,所以通常有一个已经存在的工作实现。数据对象往往具有决定性的行为,而且几乎没有外部交互作用,所以在提高测试稳定性或减少测试脆弱性方面通常很少有什么收获。

作为问题的评论中提到biziclop

永远记住自动化测试的目的是什么:找到在最短的时间错误,用尽可能小的努力。或者转过来:建立对代码正确性的信心。

从这个意义上讲,嘲讽数据对象对测试的可读性和正确性的成本很高,也不太可能提供有关测试正确性或稳定性的好处。我会避免它。

相关问题