Advanced   Java   Services JUnit in Eclipse 2


Ein eigenes Testverzeichnis anlegen

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


Beispiel 2

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


Die Methoden setUpBeforeClass(), tearDownAfterClass(), setUp(), tearDown()

Ü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.

eclipse-junit-10.jpg

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

Die Funktion der setUp()- und tearDown()-Methoden

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.