根据http://martinfowler.com/articles/mocksArentStubs.html
,可以按照古典主义者或模仿者的方式编写单元测试为单个方法编写classist和mockist单元测试是否会增加代码的健壮性,因为状态和行为都经过测试?
我的同事似乎只是一直在嘲笑,因为他们是“榜样”,我认为除非我有充分的理由不这样做,否则我也会嘲笑。 (我是单元测试的新手)。但是,我觉得只测试mockist的方式假定了未经测试的私有方法的实现的正确性,这也是我想要进行类别测试的原因(间接测试私有方法)。
还是浪费时间?
答案 0 :(得分:1)
私有方法只是一个类的内部工作方式。换句话说,如果你完全测试公共方法然后是私有方法,但按照定义,它们正是他们需要做的,因为只有公共行为很重要。
我对'州'有两个想法。
1)如果状态是内部(私有),那么它是如何实现行为的实现。这是一个内在的“秘密”。如果它很重要,那么测试结果行为。
2)如果州是公开的......没问题。
我会去嘲笑。
答案 1 :(得分:1)
使用Mocks进行测试确实间接测试私有方法 - 任何私有方法都应该在调用堆栈中使用一些公共方法。如果您已经实现了公共方法的100%代码覆盖率,则会调用所有私有方法 正如我从Fowler的文章中回忆的那样,区别在于mockist测试了类的内部工作 - 它们验证了你的类调用了他们期望的其他类API。如果您未能正确使用它,那么您的类的功能将受到影响是有道理的 - 例如如果你不写一些数据到数据库,甚至更糟:写错了数据。
答案 2 :(得分:0)
模拟或存根通常不用于测试私有成员,因为这些成员是封装的核心,没有人会依赖于更新版本的程序集中私有成员的存在。如果您确实需要对私人成员进行单元测试,请考虑阅读How do you unit test private methods?。
使用存根而不是模拟的一个很好的理由是显而易见的,即当您需要在特定操作后验证对象的状态时,如果它适合您将使用它们的任务。有些人错误地认为模拟是一个新代的单元测试,而且不应该使用过时的存根。实际上,您可以单独或组合使用这两种技术。
答案 3 :(得分:0)
是。使用这两种策略将确保测试代码的稳健性,因为您正在测试代码之间的依赖关系(mockist)和模拟生产环境(状态)的功能。通过混合这两种方法,您可以保证平衡的测试方法。
但请注意,基于状态的测试通常需要更多开销,因为您必须为与测试对象相关的所有组件设置和配置环境。这通常会导致脆弱的测试。对mockist测试进行一小部分基于状态的测试应该足够了。
使用模拟策略可以促进单一责任原则,其中每个类都有一组有限的责任,并依赖于其他类来履行其职责。根据我的经验,如果对象之间的责任定义不明确,您将发现自己陷入基于状态的测试,这表明封装或抽象问题。
答案 4 :(得分:0)
Will writing both classist and mockist unit tests for a single method increase robustness of the code since both state and behaviour is tested?
没有。两次测试是Duplication。
我上次检查时,这些方法并不是排他性的......相反,它们是互补的。根据个别测试的具体情况,您可以选择最佳方法。