Advanced Java Services | JUnit in Eclipse 2 |
Da JUnit für jede zu testende Klasse eine eigene Testklasse anlegt, dient es der Übersichtlichkeit wenn man ein eigenes Testverzeichnis anlegt. Am besten macht man dies bevor man die Testklasse anlegt.
Projekt markieren -> rechte Maustaste (Kontextmenu) -> New -> Source Folder
Wir verwenden nun eine Klasse Datum. Sie enthält zwei Methoden und zwei Konstruktoren. Hier wird nur ihr grundsätzlicher Aufbau gezeigt.
public class Datum { private int tag, monat, jahr; private int gregYear = 1582; public Datum() { LocalDate ld = LocalDate.now(); this.tag = ld.getDayOfMonth(); this.monat = ld.getMonthValue(); this.jahr = ld.getYear(); } public Datum(int tag, int monat, int jahr) { if (jahr < gregYear) throw new IllegalArgumentException(jahr + ": Greogorianischer Kalender gilt erst ab 1582"); this.tag = tag; this.monat = monat; this.jahr = jahr; } /* Liefert den Wochentag als String */ public String getWochentag() { if (jahr < gregYear) throw new IllegalArgumentException(jahr + ": Greogorianischer Kalender gilt erst ab 1582"); // ... switch (wochentag) { case 0 : return "Sonntag"; case 1 : return "Montag"; // ... } } /* Berechnet zu einem Jahr das Osterdatums nach Gauss Gibt einen String der Form 04.05.2012 zurück */ public String getEasterDate() { if (jahr < gregYear) throw new IllegalArgumentException(jahr + ": Greogorianischer Kalender gilt erst ab 1582"); // ... return String.format("%02d.%02d.%4d", tag, monat, jahr); } } // end class
Über das Kontextmenü wählen wir wieder JUnit Test Case an und erstellen eine Testklasse. Diesmal lassen wir uns auch die vier zusätzliche angebotenen Methoden erzeugen um zu erkennen welche Funktion sie haben.
Auch für den Konstruktor unserer zu testenden Klasse lassen wir uns eine Testmethode erzeugen.
In der von JUnit erstellten Testklasse ergänzen wir einen Defaultkonstruktor und Konsolausgaben in allen Methoden um den Ablauf verfolgen zu können.
import static org.junit.Assert.*; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class DatumTest { // von Hand ergänzt public DatumTest() { System.out.println("Konstruktor DatumTest"); } @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("setUpBeforeClass"); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("tearDownAfterClass"); } @Before public void setUp() throws Exception { System.out.println("setUp"); } @After public void tearDown() throws Exception { System.out.println("tearDown"); } @Test public void testDatum() { System.out.println("testDatum"); } @Test public void testDatumIntIntInt() { System.out.println("testDatumIntIntInt"); } @Test public void testGetWochentag() { System.out.println("testGetWochentag"); Datum date = new Datum(24, 12, 2016); String tag = date.getWochentag(); assertEquals("Samstag", tag); } @Test public void testGetEasterDate() { System.out.println("testGetEasterDate"); } }
Die Ausführung erzeugt neben der Fehlermeldung folgenden Konsoloutput, der die Funktion der vier Methoden erklärt (Leerzeilen von Hand eingfügt). Man sieht an den Konstruktoraufrufen, daß für jede Testmethode ein eigenes Objekt angelegt wird
setUpBeforeClass Konstruktor DatumTest setUp testDatum tearDown Konstruktor DatumTest setUp testDatumIntIntInt tearDown Konstruktor DatumTest setUp testGetEasterDate tearDown Konstruktor DatumTest setUp testGetWochentag tearDown tearDownAfterClass
JUnit legt für jede zu testende Methode ein eigenes Objekt an. Innerhalb der setUp()-Methoden kann man evtl. notwendige Initialisierungen vornehmen wie etwa den Aufbau von Datenbankverbindungen, das Laden von Dateien etc. Initialisierungen die nur einmal für eine Klasse notwendig sind kann man in setUpBeforeClass() unterbringen. Initialisierungen die für das zugehörige Objekt notwendig sind kann man in setUp() unterbringen. Die tear-Methoden sind dann zum Aufräumen da. Wie man sieht wird jede der zu testende Methoden und auch der zu testende Konstruktor wird durch eine setUp()- und eine tearDown()-Methode eingerahmt.