11

我的开发团队已经开始使用Mockito并拥有已定义为“final”的类。我在 Joshua Bloch 的 Effective Java 和 SO 线程When to use final中读到所有类都应该使用 final 修饰符。线程中存在一些分歧,但我确实同意强制类组合的想法,除非继承有意义。

当我想使用像 Mockito 这样要求类没有“final”修饰符的测试框架来测试类时,我应该怎么做? 我希望其他人在他们的开发过程中遇到过类似的问题。您的开发团队达成了哪些决议?

有两个明显的答案,例如使用 JMock 或删除我们要测试的类上的“final”修饰符,但我们想坚持使用一个外部测试框架(JUnit 除外),可能很难说服其他开发人员删除“最终”修饰符。

谢谢。

4

3 回答 3

10

你最需要什么:

  1. 确保某人不会从您的班级继承的能力,或者
  2. 使用您选择的模拟框架确保您的代码可测试的能力?

一般来说,我相信你不需要强制执行(1)。对我来说,可测试性 (2) 更为重要。什么最适合您的情况?

于 2010-01-12T21:37:15.373 回答
4

如果您希望您的类是最终的,您可以让它们实现接口。接口是可模拟的。

于 2010-01-12T21:59:47.610 回答
4

正如其他答案中已经提到的,您可以使最终类实现接口并在测试中模拟接口。

这是使用 Mock 对象的好处之一;在这种情况下,它们会让您思考如何更好地组织代码。如果您的代码库对最终类有很多引用(因此绑定到具体实现),则它违反了“编程到接口”的 OO 原则,并且需要更好的可测试性将帮助您考虑重构以消除对具体实现的依赖。

这篇关于使用 Mock Objects Endo-testing: Unit Testing with Mock Objects的论文有一节 (4.4) 标题为接口发现,解释了模拟对象如何帮助发现接口。

于 2010-01-13T05:46:26.117 回答