tags:

views:

281

answers:

3

My development team has started to use Mockito and have classes that have been defined as 'final'. I've read in Effective Java by Joshua Bloch and in the SO thread When to use final that all classes should use the final modifier. There have been some disagreement in the thread, but I do agree with the idea of forcing class composition unless inheritance makes sense.

What should I do when I want to test classes using a testing framework like Mockito that requires classes to not have the 'final' modifier? I'm hoping someone else has encountered similar issues during their development. What resolutions did your development team arrive on?

There are two obvious answers such as using JMock or remove the 'final' modifier on the classes we want to test, but we want to stick with one external testing framework (besides JUnit) and it may be hard to convince other developers to remove the 'final' modifier.

Thanks.

+4  A: 

What do you need most:

  1. The ability to make sure that somebody doesn't inherit from your class, OR
  2. The ability to make sure that your code is testable using your mocking framework of choice?

Generally, I believe that you don't need to enforce (1). For me, testability (2), is far more important. What fits your situation best?

Kaleb Pederson
Testability is far more important IMHO and I believe it fits our situation.
austen
There is no need to sacrifice design for the sake of "testability". You can have both, by simply using the right tool for the job. In this case, use one of the Java mocking tools which can mock final methods and classes: JMockit (my own tool), or PowerMock (which supports the Mockito API, so you don't have to fully rewrite existing tests).
Rogerio
+2  A: 

If you want your classes to be final you can have them implement interfaces. The interfaces are mockable.

Laurence Gonsalves
+3  A: 
sateesh
I like the idea of interface discovery.
austen
When I write code that uses a final class and this class does not implement a separate interface, I am *not* violating the "program to an interface, not an implementation" GoF principle. The principle does *not* require that every class implement a separate interface. Other parts of the GoF book make this clear, for those willing to actually read it.
Rogerio