2012-07-22 26 views
7

Ich schrieb eine Schnittstelle MyInterface, die von verschiedenen Implementierungen implementiert werden wird.Generic JUnit Test Klasse

Ich schrieb auch eine Klasse MyInterfaceTest, die generische Testmethoden enthält, die alle Implementierer verwenden sollten, um ihre Implementierungen zu testen.

Ich weiß nur nicht, wie man es als JUnit-Test arbeiten lassen kann.

Derzeit habe ich so etwas wie dieses:

public class MyInterfaceTest { 
    private static MyInterface theImplementationToTest = null; 

    @BeforeClass public static void setUpBeforeClass() throws Exception { 
       // put your implementation here: 
     theImplementationToTest = new Implementation(...); 
    } 

    @AfterClass public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test public void test1() { /* uses theImplementationToTest */ }  
    @Test public void test2() { /* uses theImplementationToTest */ }  
} 

Ich kann die statische Methode setUpBeforeClass, da die Initialisierung jeder Implementierung viel Zeit in Anspruch nimmt, so will ich es einmal für alle Tests initialisieren.

Mit dieser Version des Tests müssen die Implementierer den Code setUpBeforeClass ändern und ihre eigene Implementierung einfügen.

Ich bin mir sicher, dass es eine andere Möglichkeit gibt, MyInterfaceTest zu schreiben, so dass die Implementoren es nur erben oder einen Parameter senden müssen und den Code nicht ändern müssen. Allerdings habe ich in JUnit nicht genug Erfahrung, um es zum Laufen zu bringen. Können Sie mir bitte zeigen, wie das geht?

Antwort

6

Sie können die Unterklasse nur die Methode vor der Klasse implementieren lassen und alle Tests erben.

import org.junit.*; 

public class ImplementingClassTest extends MyInterfaceTest { 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
     // put your implementation here: 
     theImplementationToTest = new MyInterfaceImpl(); 
    } 

} 

Dies macht die abstrakte Klasse, die Sie sehen schreiben wie:

import org.junit.*; 

public abstract class MyInterfaceTest { 
    protected static MyInterface theImplementationToTest = null; 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test 
    public void test1() { /* uses theImplementationToTest */ 
    } 

    @Test 
    public void test2() { /* uses theImplementationToTest */ 
    } 
} 

Normalerweise würden Sie die Methode die Unterklassen erforderlich machen abstrakt zu implementieren. Kann das hier nicht tun, da es sich um eine statische Setup-Methode handelt. (Außerdem sollten Sie die Instanziierungen so umgestalten, dass sie nicht lange dauern, da dies oft ein Anti-Pattern ist).

-3

Sie sollten ein Glas Namen junit-4.10.jar herunterladen und es zu Ihrem Projekt hinzufügen. Lassen Sie dann Ihre Klasse MyInterfaceTest die Klasse TestCase erben, wie public class MyInterfaceTest extends TestCase.

+1

Wie hilft das das ursprüngliche Problem zu lösen? –

+0

Was ist das ursprüngliche Problem? –

+0

Wie wird ein statisches Setup/Teardown mit einer Implementierung verwendet, die je nach Unterklasse variiert? Wie in meiner Antwort beschrieben. –