我的开发团队已经开始使用Mockito并且已经将类定义为'final'。我读过Joshua Bloch的Effective Java和SO线程When to use final,所有类都应该使用final修饰符。线程中存在一些分歧,但我同意强制类组合的想法,除非继承有意义。
当我想使用像Mockito这样的测试框架测试类时,我需要做什么才能让类没有'final'修饰符?我希望其他人在他们的期间遇到类似的问题发展。您的开发团队已达成哪些决议?
有两个明显的答案,例如使用JMock或删除我们想要测试的类的'final'修饰符,但我们想要坚持使用一个外部测试框架(除了JUnit)并且可能很难说服其他开发人员删除'final'修饰符。
感谢。
答案 0 :(得分:10)
你最需要什么:
一般来说,我认为您不需要强制执行(1)。对我来说,可测试性(2)更为重要。什么最适合你的情况?
答案 1 :(得分:4)
如果您希望您的课程是最终的,您可以让他们实现接口。接口是可以模拟的。
答案 2 :(得分:4)
正如在其他答案中已经提到的,您可以使您的最终课程得以实施 接口和测试中模拟接口。
这是使用Mock对象的好处之一;在这样的场景中,它们会让您思考如何更好地组织代码。如果您的代码库有很多对最终类的引用(从而绑定到具体实现),它违反了“编程到接口”的OO原则,并且需要更好的可测试性将帮助您考虑重构以消除对具体实现的依赖。
关于模拟对象Endo-testing: Unit Testing with Mock Objects的使用的论文有一个标题为 接口发现 的部分(4.4),它解释了模拟对象如何帮助发现接口。 / p>