Mit Unit-Tests lassen sich die Implementierungen eines Interfaces nicht ohne weiteres testen.
Natürlich ist es möglich für jede Implementierung einen extra Testcase zu schreiben: Aber entweder man testet speziell die Implementierung und macht damit das Interface überflüssig oder man dupliziert den Testcase per copy/paste. Letzteres würde aber dem empfehlenswerten DRY Prinzip arg widersprechen.
Mit JUnit 4.x gibt es aber parametrisierte Testcases, die es relativ einfach ermöglichen mehrere Implementierungen eines Interfaces auf einmal zu testen:
// We run this test parameterized @RunWith(value = Parameterized.class) public class IntafaceTest { @Parameters public static Collection implementations() { // For each test run the implementation is injected Object[][] data = new Object[][]{ {IntafaceImplA.class.getCanonicalName()}, {IntafaceImplB.class.getCanonicalName()} }; return Arrays.asList(data); } private Class _implName; private Intaface _sut; public IntafaceTest(String implName) { try { this._implName = Class.forName(implName); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Before public void setUp() throws InstantiationException, IllegalAccessException { // The implementation is instanciated _sut = (Intaface) _implName.newInstance(); } @Test public void test1() { assert(_sut.foo()); } }