# Mittels JUnit Reihe von DAOs testen



## Dobii (15. Jan 2010)

Hallo erstmal!

Mein Problem sind ja nicht die JUnit-Tests an sich, sondern dass vor jedem Test die Testdaten in der Datenbank wieder zurückgesetzt werden sollen.
Ich bin Anfänger im Gebiet Java und kenne mich auch nicht so gut mit fertigen Loggern oder JDO/JPox aus, weshalb ich neim Versuch DBUnit zu verwenden, ebenfalls gescheitert bin.
Ausserdem möchte ich versuchen, so viel wie Möglich selber zu programmieren.

Kann mir jemand von Euch weiterhelfen? Für den Fall dass ich vorhin zu sehr um den heissen Brei herumgeredet habe: Ich möchte lediglich, dass vor jedem Test die Datenbank in ihren Testzustand zurückgesetzt wird.


Dankeschön im Vorraus,
Euer Dobii


----------



## maki (15. Jan 2010)

DBUnit ist imho einer der besseren Wege, was war denn dein problem damit?

Back Door Manipulation at XUnitPatterns.com
Unter "Example: Back Door Fixture Setup"


----------



## Dobii (15. Jan 2010)

Mein Hauptproblem ist, dass ich selbst nach dem Lesen einiger Tutorials (die GettingStarted-Sektion auf der Website von DBUnit selbst, ebenso wie das Tutorial von Realsolve und noch 2 weiteren, die ich jedoch nicht mehr genau weiss..) nicht im Stande war, einen Test mittels DBUnit durchzuführen.

Ich verwende die IntelliJ IDEA um mein Projekt zu schreiben, aber verwende die IDE lediglich zum debuggen, aber nie um einen Test zu starten. Das mache ich über ant, wo die Datenbank neu generiert und alle Tests gestartet werden. Problem dabei: Die Datenbank wird nur einmal neu erstellt und das ist vor ALLEN Tests.

Ich habe das JAR-File von DBUnit, ebenso wie die API von slf4j (weil DBUnit eine Exception geworfen hat, als ich diesen Logger nicht eingebunden gehabt habe) und das Simple-JAR, ebenfalls von slf4j eingebunden. Jetzt gibt es grundsätzlich keine Exceptions mehr, aber ich bin nicht im Stande das XML-File mit den Datenbank-Schemen zu laden (weil das System die Datei nicht findet).

Wäre es Möglich mir ein einfaches Schritt-für-Schritt Tutorial (da ich gerne vorher geleitete Praxis habe bevor ich etwas selbst verwende, da ich mir so einfach leichter tue) zu empfehlen? Mehr bräuchte ich nicht, aber die Tutorials die ich gefunden habe, haben mir nicht wirklich weitergeholfen. Das Tutorial darf auch gerne in Englisch sein, es beschränkt sich also nicht auf deutsche Tutorials.

Ich möchte jetzt schon mal im Vorraus Danken und hoffe, dass irgend jemand von Euch ein gutes Tut zur Hand hat 
Sollte es dann noch Fragen geben, dann werd ich die natürlich hier stellen 

Danke schonmal,
Euer Dobii


----------



## maki (15. Jan 2010)

Hab doch gerade den Link zu einem  Beispiel gepostet, da braucht es auch keine XML Dateien für.
Was in dem Besipiel noch fehlt ist eben die tearDown Methode in der die Tabelleninhalte wieder gelöscht werden, sollte aber mit der DBUnit Doku schnell erledigt sein.
Nachtrag: Doch, der Teardown steht auch im Beispiel, hast du es denn überhaupt gelesen?

Wenn du deinen Code zeigst, könnte man konkreter werden 

Dein Problem die XML Datei zu laden hat wohl was mit der Art wie du sie laden willst zu tun: Smartly load your properties - JavaWorld


----------



## Dobii (15. Jan 2010)

Doch, ich hab es gelesen - vorher leider etwas zu unbeherzt aber jetzt etwas ausführlicher. Das Problem sind die einzelnen Code-Schnipsel als Beispiele und ich verstehe zum Beispiel nicht, ob diese "Beispiel-Klasse" jetzt DBTestCase oder eine der anderen Klassen (oder überhaupt eine andere Klasse erweitert)? Und ich weiss nicht wieso, aber ich kann diese Code-Schnipsel aus den Beispielen nicht zu einer funktionierenden Klasse zusammensetzen. Ich weiss zwar jetzt (durch deine beiden Links, vielen Dank nochmal), wie ich externe XML-Files richtig einbinde oder diese direkt in der Testklasse selbst erstelle - daran liegt es einmal nicht.

Mein Problem liegt jetzt eher darin, dass ich das Beispiel aus deinem ersten Link nicht nachprogrammieren kann, weil mir ein wenig das "drum herum" fehlt. Ich kenne zwar einen Teil des Codes, aber oben beschriebenes Problem mit dem fehlenden "extends"-Teil machen mir grade das Leben schwer. Gibts einen kompletten Code einer Klasse, damit ich schauen kann wie diese aufgebaut ist?

Danke jedoch schonmal für die beiden Links und die - echt erstaunlisch schnelle - Hilfe!
Liebe Grüße, Dobii


----------



## maki (15. Jan 2010)

Bis einschliesslich JUnit 3 musste man von TestCase erben, seit JUnit 4 kann man Annotationen verwenden.

Es wäre einfacher zu helfen wenn du den Code posten würdest


----------



## Dobii (15. Jan 2010)

Noch eine kurze Frage, bevor ich hier jetzt den ganzen Code wild reinkopier  Was brauchst du für einen Code? Den Test für das DAO, so wie ich es bis jetzt (ohne DBUnit) gemacht habe, die Veränderung nach der Umschreibung mit DBUnit oder beides? xD
Ich kenne lediglich den Weg mit dem TestCase, dass man das mit einer Annotation auch machen kann habe ich noch nicht gewusst! Werd mal danach googlen 

Meine Grüße,
Dobii


----------



## maki (15. Jan 2010)

Zeig den Test-Code der dir Probleme bereitet


----------



## Dobii (15. Jan 2010)

So, hab noch etwas entdeckt und daran gebastelt. Dass die Daten in die Datenbank übernommen werden funktioniert (nur, dass sie danach nicht mehr gelöscht werden, aber das liegt daran, dass ich die tearDown() methode noch nicht überschrieben habe - per Default passiert da ja sonst garnichts!). Lediglich ist "loadedData" null - muss diese Variable von Hand gesetzt werden und wenn ja, wo?

Hier mein Code:

```
package at.dobii.dbunit;

import org.dbunit.DatabaseTestCase;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;

import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;

public class DBUnitTest extends DatabaseTestCase {
  private static final String TABLE_NAME = "test";

  private IDataSet loadedDataSet;

  protected IDatabaseConnection getConnection() throws Exception {
    Class driverClass = Class.forName("com.mysql.jdbc.Driver");
    Connection jdbcConnection = DriverManager.getConnection("jdbc:mysql://localhost/dbunittest", "root", "passwort");
    return new DatabaseConnection(jdbcConnection);
  }

  protected IDataSet getDataSet() throws Exception {
    StringBuilder xml = new StringBuilder("<?xml version='1.0' encoding='UTF-8'?>");
    xml.append("<dataset>");
    xml.append("<").append(TABLE_NAME).append(" id='1' message='This is a test message' inserted='true'/>");
    xml.append("<").append(TABLE_NAME).append(" id='2' message='Another test message' inserted='true'/>");
    xml.append("</dataset>");
    return new FlatXmlDataSet(new StringReader(xml.toString()));
  }

  public void testCheckDataLoaded() throws Exception {
    assertNotNull(loadedDataSet);
    int rowCount = loadedDataSet.getTable("MANUFACTURER").getRowCount();
    assertEquals(2, rowCount);
  }
}
```

Achja, hab mich jetzt mal angemeldet weil ich glaube, dass ich hier noch des Öfteren nerven werde *gg

Danke schonmal,
liebe Grüße,
Dobii


----------



## Dobii (16. Jan 2010)

Okay, hallo nochmal!

Ich hoffe dass dieser Doppelpost nicht so schlimm ist, aber ich konnte den letzten Beitrag von mir nicht mehr editieren. Ich will Euch nur sagen, dass alles gelöst ist. Ich habe, nach Erstellen des Datasets (dem StringBuilder xml) die Variable "loadedDataSet" einfach per Hand gesetzt und konnte somit ohne Probleme die ausgelesenen Daten überprüfen!
Es gibt eventuell noch eine andere Möglichkeit (und falls diese jemand kennt, so soll er sich bitte hier oder per PN melden :]), aber so funktioniert es ohne Probleme!
Danke nochmal an maki und seine Geduld mit mir, in Zukunft gibts einen TestCode bereits im ersten Posting 

Liebe Grüße,
Dobii

EDIT:
Sorry, aber ich habe vergessen, dass ich dieses Thema als Gast erstellt und somit keine Macht über die Schließung habe. Möge ein Mod, der dieses Thema überfliegt (vielleicht sogar Maki? ) dieses Thema als Erledigt markieren? Dankeschön


----------



## maki (17. Jan 2010)

Bitte schön


----------

