J'essaie d'utiliser DBUnit avec JDBC et HSQLDB, et je n'arrive pas à le faire fonctionner - même si j'ai déjà utilisé DBUnit avec Hibernate avec beaucoup de succès. Voici le code:Comment tester avec DBUnit avec JDBC simple et HSQLDB sans faire face à une exception NoSuchTableException?
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");
}
}
Et voici la dataset.xml en question:
<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>
Ce test me donne un 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)
Si je supprime le databaseTester.onSetup () ligne, j'obtiens une SQLException à la place:
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)
L'ensemble de données en lui-même fonctionne, puisque je peux y accéder comme il se doit:
ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();
Qu'est-ce que je manque ici?
EDIT: Comme l'indique @mlk, DBUnit ne crée pas de tables. Si j'insérer ce qui suit avant d'ajouter l'ensemble de données, tout se passe bien:
PreparedStatement pp = databaseTester.getConnection().getConnection().prepareStatement(
"create table mytable (itemnumber varchar(255) NOT NULL primary key, "
+ " something varchar(255), other varchar(255))");
pp.executeUpdate();
J'ai posté une question de suivi que Is there any way for DBUnit to automatically create tables from a dataset or dtd?
Je suis maintenant passé à une instance locale Oracle XE en cours d'exécution dans une machine virtuelle. La raison en est que nous pouvons continuer à développer lorsque nous ne sommes pas connectés au réseau interne. –
Avec une base de données en mémoire, je peux exécuter des tests unitaires n'importe où, sans avoir à changer de configuration et sans avoir à démarrer un serveur de base de données. Principalement, ils fonctionnent sur différentes boîtes de dev et sur le serveur CI. C'est un énorme avantage dans mon livre. – Spencer
Oui c'est. Personnellement, je l'ai trouvé beaucoup plus lent, mais cela a peut-être changé maintenant. Le temps nécessaire pour démarrer une instance VM'ed Oracle XE locale est une petite chose une fois par jour. –