Mittels JUnit Reihe von DAOs testen

D

Dobii

Gast
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
 
D

Dobii

Gast
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
 
M

maki

Gast
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
 
D

Dobii

Gast
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
 
M

maki

Gast
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

Mitglied
Noch eine kurze Frage, bevor ich hier jetzt den ganzen Code wild reinkopier :D 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
 

Dobii

Mitglied
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:
Java:
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

Mitglied
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? :D) dieses Thema als Erledigt markieren? Dankeschön :)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Wie mittels PL/SQL eine Datenbankverbindung blockieren? Datenbankprogrammierung 6
Zrebna Lediglich interne DB-Verbindungen (Connections) auslesen - mittels Java Datenbankprogrammierung 4
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
G Laufzeit Bestimmung mittels Landau Symbolic Datenbankprogrammierung 13
G Laufzeit eines Algorithmus mittels Big Theta bestimmen Datenbankprogrammierung 5
P Mittels Java einen neuen MySQL User erstellen Datenbankprogrammierung 4
C Hibernate n:m mittels Zwischentabelle und bidirektionaler Zugriff Datenbankprogrammierung 2
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
T Mittels SQL-String ein Berechnung vornehmen Datenbankprogrammierung 2
J MYSQL-Zugriff mittels einer Java-Bean Datenbankprogrammierung 42
K Zugriff mittels JDBC funktioniert nur lokal Datenbankprogrammierung 5
M Mysql datenbank auslesen und mittels servlet wiedergeben Datenbankprogrammierung 3
W Problem bei Connection mit SQLServer-Datenbanke mittels Java Datenbankprogrammierung 2
K Stored Procedures, mittels Java Datenbankprogrammierung 8
J JUNIT und CRUD-Datenbank Datenbankprogrammierung 4
turmaline Oracle Testen DB-Background-Jobs mit JUNit Datenbankprogrammierung 10
A No persistance provider JUNIT Datenbankprogrammierung 5
H Oracle DBUnit/JUnit auf Oracle mit verschiedenen Schemata? Datenbankprogrammierung 8
P Hibernate -> Probleme bei n:m-Relation und JUnit Datenbankprogrammierung 10
S HSQLDB Verbieten eines update auf eine bestimmte reihe Datenbankprogrammierung 4
F H2:Wie kann man insert eine Reihe "int" wert als blob in table? Datenbankprogrammierung 12
A Reihe in Datenbank überschreiben falls bereits vorhanden Datenbankprogrammierung 2
E ResultSet vergisst Reihe? Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben