Häufig kommt es beim (Unit) Testing vor, dass viele der Test Cases zumindest teilweise eine gemeinsame Fixture brauchen. So z. B. wenn einige der getesteten Klassen gegen eine Testdatenbank laufen. Hierbei muss sichergestellt werden, dass die Datenbank richtig initialisiert und wieder heruntergefahren wird und sich vor jedem Test im gleichen Zustand befindet. JUnit 4 bietet eine interessante Möglichkeit diese Vorgänge zentral und ohne Code-Duplizierung auszulagern. Damit jede Test-Methode (Annotation @Test in Junit 4) die gleiche Fixture zur Verfügung hat, wird diese üblicherweise in setUp- und tearDown-Methoden hergestellt. Um nicht in jeder von der Datenbank abhängigen Test-Klassen den Datenbank-Code hierin zu duplizieren, ist es mit JUnit 4 möglich eine Basisklasse für alle von der Datenbank abhängigen Tests zu benutzen, die diese Aufgabe übernimmt:
import org.junit.After;
import org.junit.Before;
public abstract class DatabaseTestCase {
@Before
public void initDatabase() {
System.out.println("Initializing DB");
// init db stuff
}
@After
public void clearDatabase() {
System.out.println("Clearing DB");
// set db to old state
}
}
Ein konkreter Test, der die Datenbank benutzt, könnte dann wie folgt aussehen:
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class FooDBTest extends DatabaseTestCase {
@Before
public void setUp() {
System.out.println("Initializing test case");
}
@Test
public void test() {
System.out.println("I should test the DB");
}
@After
public void tearDown() {
System.out.println("Tear down of test case");
}
}
Der entscheidende Punkt hier ist, dass JUnit 4 versichert, dass die mit @Before gekennzeichneten Methoden einer Oberklasse garantiert vor den mit @Before gekennzeichneten Methoden der Unterklasse und mit @After markierte Methoden der Oberklasse erst nach den mit @After markierten Methoden der Unterklasse aufgerufen werden. D. h. FooDBTest kann auch in seiner setUp-Methode schon davon ausgehen, dass die Datenbank initialisiert ist.
Dieses Verhalten lässt sich natürlich auch für jede beliebige andere Test-Fixture benutzen.