Wie kann ich testen mit DBUnit mit reinem JDBC und Datenbank HSQLDB, ohne mit einem NoSuchTableException?
Ich versuche, mit DBUnit mit reinem JDBC und Datenbank HSQLDB, und kann nicht ganz, dass es funktioniert-obwohl ich verwendet habe, DBUnit mit Hibernate früher mit großem Erfolg. Hier ist der code:
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 dies 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 () - Zeile, bekomme ich eine SQLException statt:
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)
Dataset an sich arbeiten, da kann ich darauf zugreifen, wie es sein sollte:
ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();
Was vermisse ich hier?
BEARBEITEN: @mlk Punkte aus, DBUnit keine Tabellen erstellen. Wenn ich legen Sie die folgenden, bevor Sie den dataset, geht alles reibungslos:
PreparedStatement pp = databaseTester.getConnection().getConnection().prepareStatement(
"create table mytable ( itemnumber varchar(255) NOT NULL primary key, "
+ " something varchar(255), other varchar(255) )");
pp.executeUpdate();
Ich habe eine follow-up Frage Gibt es eine Möglichkeit für DBUnit automatisch zu erstellen, Tabellen aus einem dataset oder einer dtd?
InformationsquelleAutor der Frage neu242 | 2009-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
dbUnit keine Tabellen erstellen. Auch könnte es mit den wenigen Informationen in der XML-Datei. Hibernate glaube ich kann die Tabellen erstellen.
Dies ist einer der Gründe, warum ich nicht mehr mit in-memory-Datenbanken und stattdessen bekam die DBA zu geben, dass jeder Entwickler eine eigene Datenbank. Jeder Entwickler dann hält die Datenbank up-to-date mit den gleichen scripts, in denen später lief auf live. Dies fügt einen geringen overhead (alle Entwickler müssen Ihre Datenbanken up-to-date), aber heißt, Sie brauchen nicht zu verwirren über den Aufbau der Datenbank für jeden Lauf und Sie können sicher sein, dass die Abfragen liefen im test-Arbeit in live.
Der zweite Grund war die Geschwindigkeit. Ich fand die Erstellung der in-memory-Datenbank dauerte viel länger, als einfach nur die Verbindung zu einer vorhandenen Datenbank.
Der Dritte Grund war das reißen ist keine destruktive (start-up-Tücher der Datenbank). Das bedeutet, dass ich laufen kann das SQL unter test auf der Datenbank zu helfen, herauszufinden, warum ein test fehlschlägt.
Update: 20171115
Hab ich da wechselte mit JUnit Regeln, dass das start-up eine echte Instanz des Datenbank-Servers und so etwas wie FlywayDB um die Datenbank zu konstruieren (und mit den gleichen Skripts im Leben wie im test, mit der Anwendung verantwortlich für den Aufbau der Datenbank). Es ist deutlich langsamer als die Verwendung einer bereits bestehenden Datenbank. Aber mit gut definierten microservices (und damit die Reduzierung der Funktionalität, muss das testen) und sehr fest auf die tests wird eine Datenbank, die Sie migrieren können, solche Probleme und die Vorteile einer lokalen Datenbank, die immer die Spiele live.
Tut es leider bedeuten, das der test abreißen, ist immer destruktiv, aber ein gut platziertes break point löst.
InformationsquelleAutor der Antwort Michael Lloyd Lee mlk
...einige Jahre später haben wir jetzt bessere Möglichkeiten
Spring Boot/Spring JDBC initialisieren können eine Datenbank mit reinem JDBC.
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
InformationsquelleAutor der Antwort Asa
In den Fall, Sie erstellen Ihre Tabellen vorab-wie vorgeschlagen hier bekommen und noch NoSuchTableException, dann gibt es etwas falsch mit dem schema. Bevor Sie drehen Sie nun verrückt, das hantieren mit ihm, in alle Arten von seltsamen und wunderbaren Möglichkeiten, versuchen Sie die schema-parameter ÖFFENTLICHEN beim erstellen der
IDatabaseConnection
:Es hat mich einige Schritt durch die DbUnit-code mit dem debugger aber das scheint, den trick zu tun.
InformationsquelleAutor der Antwort raoulsson