Comment est-ce que je teste avec DBUnit avec JDBC simple et HSQLDB sans faire face à une exception NoSuchTableException?
Je suis en train d'utiliser DBUnit avec la plaine de JDBC et HSQLDB, et n'arrive pas à le faire fonctionner, même si j'ai utilisé DBUnit avec Hibernate plus tôt avec un grand succès. Voici le 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");
}
}
Et c'est le dataset.xml en cause:
<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 (), j'obtiens une 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)
Le jeu de données en elle-même fonctionne, puisque je ne peux y accéder comme il se doit:
ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();
Ce qui me manque ici?
MODIFIER: @mlk points, DBUnit n'est pas de créer des tableaux. Si je insérer ce qui suit avant d'ajouter le jeu 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 réponse à la question que Est-il possible pour DBUnit pour créer automatiquement les tables à partir d'un ensemble de données ou dtd?
source d'informationauteur neu242
Vous devez vous connecter pour publier un commentaire.
dbUnit ne pas créer des tables. On ne pourrait non plus avec le peu d'informations données dans le fichier XML. Hibernate je crois que peut créer les tables.
C'est l'une des raisons pour lesquelles j'ai cessé d'utiliser des bases de données en mémoire et au lieu eu le DBA pour donner à chaque développeur de leur propre base de données. Chaque développeur de garde, puis la base de données à jour en utilisant les mêmes scripts qui sont ensuite couru sur live. Cela ajoute un petit frais généraux (tous les développeurs ont besoin de garder leurs bases de données à jour) mais cela signifie que vous n'avez pas besoin de perdre sur la construction de la base de données pour chaque course et vous pouvez être sûr que les requêtes couru dans des essais en live.
La deuxième raison était la vitesse. J'ai trouvé de la création de la mémoire de la base de données a pris beaucoup plus de temps que de simplement connecter à une base de données existante.
La troisième raison est l'abattre n'est destructive (démarrage des lingettes de la base de données). Cela signifie que je peux exécuter le SQL en cours de test sur la base de données pour aider à travailler pourquoi un test est un échec.
Mise à jour: 20171115
Depuis, j'ai passé à l'aide de JUnit règles que pour le démarrage d'une véritable instance de serveur de base de données et quelque chose comme FlywayDB pour construire la base de données (et en utilisant les mêmes scripts en live comme dans le test, avec l'application responsable de la construction de la base de données). Il est nettement plus lent que d'utiliser une base de données prêtes à l'emploi. Cependant, l'utilisation bien définie microservices (et donc de réduire la fonctionnalité que les besoins des tests) et d'être très serré sur les tests obtient une base de données, vous pouvez migrer ces questions et obtenir les avantages de la base de données locale qui correspond toujours à vivre.
Il n'est hélas signifie que le test de démolir est toujours destructrice, mais un de bien placé dans le point de rupture résout.
...quelques années plus tard, maintenant, nous avons de meilleures options
Printemps Boot/Spring JDBC permet d'initialiser une base de données avec la plaine JDBC.
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
Dans le cas où vous ne créez vos tableaux initiaux comme suggéré ici et encore obtenir un NoSuchTableException, puis il ya quelque chose de mal avec le schéma. Avant de tourner fou, jouant du violon dans toutes sortes d'étranges et merveilleuses façons, essayez de définir le schéma de paramètre à PUBLIC lorsque vous créez le
IDatabaseConnection
comme suit:Il m'a fallu marcher à travers la DbUnit code avec le débogueur, mais cela semble faire l'affaire.