Ich versuche, DBUnit mit JDBC und HSQLDB zu verwenden, und kann es nicht richtig zum Laufen bringen - obwohl ich früher mit großem Erfolg DBUnit mit Hibernate verwendet habe. Hier ist der Code:Wie kann ich mit DBUnit mit JDBC und HSQLDB testen, ohne dass eine NoSuchTableException auftritt?
import java.sql.PreparedStatement;
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.XmlDataSet;
import org.junit.Test;
public class DummyTest {
@Test
public void testDBUnit() throws Exception {
IDatabaseTester databaseTester = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem", "sa", "");
IDataSet dataSet = new XmlDataSet(getClass().getResourceAsStream("dataset.xml"));
databaseTester.setDataSet(dataSet);
databaseTester.onSetup();
PreparedStatement pst = databaseTester.getConnection().getConnection().prepareStatement("select * from mytable");
}
}
Und das ist die dataset.xml in Frage:
<dataset>
<table name="mytable">
<column>itemnumber</column>
<column>something</column>
<column>other</column>
<row>
<value>1234abcd</value>
<value>something1</value>
<value>else1</value>
</row>
</table>
</dataset>
Dieser Test gibt mir ein NoSuchTableException:
org.dbunit.dataset.NoSuchTableException: mytable
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:282)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at DummyTest.testDBUnit(DummyTest.java:18)
Wenn ich entfernen Sie die databaseTester.onSetup () Linie, ich bekomme stattdessen eine SQLException:
java.sql.SQLException: Table not found in statement [select * from mytable]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at DummyTest.testDBUnit(DummyTest.java:19)
Der Datensatz an sich arbeitet, da ich es es sollte wie zugreifen:
ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();
Was ich hier fehlt?
BEARBEITEN: Wie @mlk darauf hinweist, erstellt DBUnit keine Tabellen. Wenn ich folgendes vor dem Hinzufügen des Datensatzes einzufügen, geht alles glatt:
PreparedStatement pp = databaseTester.getConnection().getConnection().prepareStatement(
"create table mytable (itemnumber varchar(255) NOT NULL primary key, "
+ " something varchar(255), other varchar(255))");
pp.executeUpdate();
gab ich eine Followup Frage Is there any way for DBUnit to automatically create tables from a dataset or dtd?
Ich habe eingeschaltet jetzt zu einer lokalen Oracle XE-Instanz in einer VM laufen. Der Grund dafür ist, dass wir uns weiterentwickeln können, wenn keine Verbindung zum internen Netzwerk besteht. –
Mit einer In-Memory-Datenbank kann ich Komponententests überall ausführen, ohne eine Konfiguration umstellen zu müssen und ohne einen DB-Server starten zu müssen. In erster Linie laufen sie auf verschiedenen Dev-Boxen und auf dem CI-Server. Das ist ein großer Vorteil in meinem Buch. – Spencer
Ja ist es. Ich persönlich fand es deutlich langsamer, aber das könnte sich jetzt geändert haben. Die Zeit, die zum Starten einer lokalen VM-Oracle XE-Instanz benötigt wird, ist ein kurzes, einmal tägliches Ereignis. –