2010-01-12 22 views
11

我的开发团队已经开始使用Mockito并且已经定义了“最终”类。我在Joshua Bloch的Effective Java中读到过,在SO线程When to use final中,所有类都应该使用最终的修饰符。在这个线程中存在一些分歧,但我同意强制课程组成的想法,除非继承是有意义的。Java最佳实践与Mockito发生冲突时怎么办

我应该怎么做时,我想使用像一个的Mockito测试框架,要求类没有“最终”修改测试类?我希望别人在开发过程中遇到类似的问题。你的开发团队做了什么决议?

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

谢谢。

+4

制定所有*类* final#肯定不是最佳实践......自从阅读Effective Java已经有一段时间了,但链接线程的共识当然似乎并不意味着这一点。你应该把类标记为'final'来表示他们不应该被延长的一些原因 - 如果没有理由,它就会增加不必要的复杂性 - 就像你发现的那样。另外,如果您意识到您确实需要将课程扩展到某个地方,则必须更改原始课程的代码以编写新课程 - 违反开放/关闭原则。 – Nate 2010-01-13 03:38:43

回答

10

那你最需要的:

  1. ,以确保有人不从你的类继承的能力,或
  2. ,以确保您的代码是可测试使用的嘲弄的框架的能力选择?

一般来说,我相信你不需要执行(1)。对我而言,可测性(2)更重要。最适合你的情况?

+0

可测性更重要恕我直言,我相信它符合我们的情况。 – austen 2010-01-13 19:28:27

+1

为了“可测试性”,不需要牺牲设计。通过简单地使用正确的工具来完成这项工作,你可以拥有两者。在这种情况下,使用其中一个可以模拟最终方法和类的Java模拟工具:JMockit(我自己的工具)或PowerMock(它支持Mockito API,因此您不必完全重写现有测试)。 – 2010-06-08 18:19:31

4

如果你希望你的类是最终的,你可以让它们实现接口。接口是可嘲弄的。

4

正如在其他答案中已经提到的那样,您可以让您的最终课程实现 接口,并在您的测试中模拟接口(s)。

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

本文在模拟的使用对象Endo-testing: Unit Testing with Mock Objects有名为接口发现一个部分(4.4),说明对象发现界面如何模拟帮助。

+0

我喜欢接口发现的想法。 – austen 2010-01-13 19:27:11

+3

当我编写使用最终类的代码并且该类没有实现单独的接口时,我*不*违反“程序到接口,而不是实现”GoF原则。该原则不*要求每个班级实施单独的界面。对于那些愿意真正阅读它的人来说,GoF书的其他部分清楚地说明了这一点。 – 2010-06-08 18:24:04