2012-03-30 10 views
2

Ich verwende DBUnit zum Testen von DAOs, die mit Hibernate und Spring implementiert wurden. Ich habe im Setup-Code von DBUnit einen Haltepunkt gesetzt und sehe, dass die entsprechenden Methoden nie aufgerufen werden. Ich muss meine Datenbank nach dem CLEAN_INSERT-Schema initialisieren, aber die Setup-Methode (überschrieben von TestCase) wird nie aufgerufen.DBUnit Setup-Methode nicht aufgerufen?

Irgendeine Idee?

BEARBEITEN: Ich sah in der Mavenabhängigkeitsgrafik, dass DBunit 2.4.8 (letzte Version) von JUnit 3.8.2 abhängt ?! Ist DBUnit mit neueren Versionen von JUnit (4.9) kompatibel?

Dank

Antwort

3

Wenn Sie JUnit verwenden sind 4, sollten Sie nicht von Testcase mehr erstreckt werden. Setzen Sie den Code aus dem Beispiel in http://www.dbunit.org/howto.html#noextend in Ihrer eigenen Methode. Sie können es beliebig benennen, solange Sie es mit @org.junit.Before annotieren.

+0

Ich habe nicht präzisiert, dass ich die erste Methode verwende, d. H. Aus der Klasse DBTestCase. In diesem Fall sollte ich keine Setup- und Teardown-Methoden definieren. –

+0

Ich habe nie 'DBTestCase' verwendet, das auf JUnit3-Code basiert und erfordert, dass Sie das zugehörige Framework für JUnit3 einrichten, anstatt die Art zu verwenden, wie JUnit4 diese Dinge behandelt. Stattdessen können Sie Ihre eigene Elternklasse schreiben, die die Datenbankeinrichtung, das Teardown und die CLEAN_INSERT-Anweisung zum erneuten Laden des Datensatzes verarbeitet. –

0

Sie können sicherlich DBUnit mit JUnit 4.x verwenden. Ich habe versucht, ein Beispiel mit Vanilla JDBC zu erstellen, indem ich Ihnen Spring und Hibernate überlasse. Obwohl ich empfehle, geben Sie this open source utility einen Versuch, Ihre Spring und DBUnit Erfahrung viel angenehmer zu machen. Beachten Sie, dass ich nicht zu diesem Dienstprogramm beigetragen habe, es einfach verwendet habe.

Eine andere DBUnit-Herausforderung ist, dass es keine Tabellen für Sie erstellt, so dass eine In-Memory-Datenbank Ihnen Probleme geben kann, werfen Sie einen Blick auf this other stackoverflow post für weitere Details dort.

Ich verwende DBUnit 2.4.8, HSQLDB 1.8.0.10 und JUnit 4.10.

import static org.junit.Assert.assertEquals; 

import java.io.StringReader; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import org.dbunit.IDatabaseTester; 
import org.dbunit.JdbcDatabaseTester; 
import org.dbunit.dataset.IDataSet; 
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; 
import org.dbunit.operation.DatabaseOperation; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 

public class DBUnitTester { 

    private IDatabaseTester databaseTester; 

    @Before 
    public void init() throws Exception { 
    databaseTester = new JdbcDatabaseTester(org.hsqldb.jdbcDriver.class.getName(), "jdbc:hsqldb:sample", "sa", ""); 

    createTablesSinceDbUnitDoesNot(databaseTester.getConnection().getConnection()); 

    String inputXml = 
     "<dataset>" + 
     " <TEST_TABLE COL0=\"row 0 col 0\" " + 
     "    COL1=\"row 0 col 1\"" + 
     "    COL2=\"row 0 col 2\"/> " + 
     "</dataset>"; 
    IDataSet dataSet = new FlatXmlDataSetBuilder().build(new StringReader(inputXml)); 
    databaseTester.setDataSet(dataSet); 
    databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT); 
    databaseTester.setTearDownOperation(DatabaseOperation.DELETE_ALL); 
    databaseTester.onSetup(); 
    } 

    private void createTablesSinceDbUnitDoesNot(Connection connection) throws SQLException { 
    PreparedStatement statement = connection.prepareStatement("CREATE TABLE TEST_TABLE(COL0 VARCHAR(20), COL1 VARCHAR(20), COL2 VARCHAR(20))"); 
    statement.execute(); 
    statement.close(); 

    } 

    @Test 
    public void firstTest() throws SQLException, Exception { 
    PreparedStatement statement = databaseTester.getConnection().getConnection().prepareStatement("SELECT COL0 FROM TEST_TABLE"); 
    ResultSet rs = statement.executeQuery(); 
    rs.next(); 
    assertEquals("row 0 col 0", rs.getString("COL0")); 
    } 


    @After 
    public void cleanUp() throws Exception { 
    databaseTester.onTearDown(); 
    } 
}