Mocks 不是 Stubs

💡 原文中文,约15000字,阅读约需36分钟。
📝

内容提要

这篇文章讨论了经典主义和模拟主义两种测试风格的差异。经典主义测试使用真实对象和状态验证,而模拟主义测试使用模拟对象和行为验证。文章还讨论了测试与实现的耦合、设计风格和测试隔离等方面的差异。无论选择哪种风格,了解这些差异对于理解测试驱动开发和使用模拟对象框架是有帮助的。

🎯

关键要点

  • 经典主义测试使用真实对象和状态验证,模拟主义测试使用模拟对象和行为验证。
  • Mock对象是测试中模拟真实对象的特例,促进基于行为验证的测试。
  • 经典风格和模拟主义风格在测试和设计交互方式上存在根本差异。
  • 经典测试使用真实的外部依赖,模拟测试则使用Mock进行操作。
  • 状态验证通过检查对象状态来验证执行结果,行为验证则通过检查方法调用来验证。
  • 使用Mock对象的测试需要设置预期,验证这些预期是否被调用。
  • 模拟主义测试强调行为驱动开发,关注系统的外部接口设计。
  • 经典TDD倾向于使用真实对象,模拟主义TDD则倾向于使用模拟对象。
  • 测试隔离在模拟主义测试中更容易,经典测试可能导致多个测试失败。
  • 测试与实现的耦合在模拟主义测试中更明显,可能影响重构的复杂性。
  • 设计风格的差异影响了开发者的设计决策,模拟主义者更倾向于使用角色接口。
  • 了解经典主义和模拟主义的差异有助于更好地理解测试驱动开发的实践。

延伸问答

经典主义测试和模拟主义测试有什么主要区别?

经典主义测试使用真实对象和状态验证,而模拟主义测试使用模拟对象和行为验证。

什么是Mock对象,它在测试中有什么作用?

Mock对象是模拟真实对象的特例,促进基于行为验证的测试。

使用Mock对象进行测试时需要注意什么?

使用Mock对象时需要设置预期,并验证这些预期是否被调用。

模拟主义测试如何影响设计决策?

模拟主义测试倾向于鼓励使用角色接口和避免返回值的方法,从而影响设计风格。

经典主义测试和模拟主义测试在测试隔离方面有什么不同?

模拟主义测试更容易实现测试隔离,而经典测试可能导致多个测试失败。

在测试驱动开发中,选择经典主义还是模拟主义有什么考虑因素?

选择取决于上下文和协作关系的复杂性,简单关系倾向于经典主义,复杂关系倾向于模拟主义。

➡️

继续阅读