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());
    }
}