As JUnit Recipes reports, this is quite simple:
- Start from the test case for one of the implementation (I assume you have them, don't you?)
- Create a new abstract test case in which you will define the expected behavior
- Have your test case extend the abstract test case
- Move the code that instantiates the object under test into a separate method, storing the object as a reference to the interface and not the implementation.
- Adjust the rest of the code referring to the interface behavior accordingly
- Create an abstract creation method for each concrete creation method
- Move all tests for the interface to the abstract test case
I tried it all in JUnit 4... and it didn't work, as when I ran the tests for all the project I got a wonderful java.lang.InstantiationException (actually several of them) for the abstract test case.
After some personal tries and a bit of googling I found that all I needed to do to have everything run smoothly was to add the @Ignore assertion to the abstract test case. Now we have no excuses!