Je sais qu'il y a eu des discussions WRT à DBunit ici. J'ai lu la plupart d'entre eux mais je ne peux pas sembler trouver une solution à mon problème.
J'ai mis en place hibernate et printemps. Je fais TDD, je devais donc faire appel à un cadre de test DAO approprié avant de rédiger un code de rédaction. Dbunit est venu à l'esprit et je dois la configurer. Voici Ma TestDataSet.xml P>
org.dbunit.dataset.NoSuchTableException: Did not find table 'USER' in schema 'null' at org.dbunit.database.DatabaseTableMetaData.<init>(DatabaseTableMetaData.java:142) at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:290) at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109) at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79) at com.cottage.test.BaseContextSensitiveTest.init(BaseContextSensitiveTest.java:64)
7 Réponses :
Avez-vous créé les tables de base de données de votre base de données?
Je n'ai pas pu trouver la documentation principale pour le drapeau, mais si vous avez cherché ce que vous avez cherché Beaucoup de résultats, incl. http://docs.jboss.org/ejb3 /docs/reference/build/reference/fr/html/entityconfig.html p> p> dbunit code> ne le fera pas pour vous, car il ne connaît pas la structure de base de données envisagée. Cependant, vous pouvez demander à Hibernat de le faire. Utilisez le drapeau
hbm2ddl code>, par exemple: p>
Merci @grzegorz Oledzki pour la réponse rapide. J'ai créé les tables de la base de données. J'utilise Liquibase pour DB Changelog Management.
Merci @grzegorz Oledzki: Vous avez raison que DBUnit ne crée pas les tables pour moi dans ma base de données. Bien que ce n'était pas le problème, le problème était que j'avais oublié d'ajouter mes fichiers de mappage au fichier hibernate.cfg.xml - j'avoue timidement. Cependant, j'avais demandé à Hibernate de le faire en utilisant cette hibernate.hbm2ddl.auto = Create-Drop comme une propriété de mon fichier de propriétés. Je ne suis pas sûr que je devrais vous marquer, vous répondez comme le bon, même s'il a été ajouté à la résolution du problème. J'apprécie vraiment vos gars d'aide. Merci un tas - c'est maintenant en train de travailler!
DBUnit ne créera pas de tables de base de données pour vous, car il dispose d'informations limitées à partir du jeu de données XML pour créer le schéma de base de données envisagé. p>
Lorsqu'il est utilisé en tandem avec hibernate, il nécessitera des fichiers de mappage HBM appropriés pour chaque pojo (que vous essayez de mapper dans les tables de base de données de test de mémoire dans la mémoire), qui est finalement utilisé dans les tests. Sans les fichiers de mappage, vous obtiendrez le En outre, un hibernate.cfg.xml valide est requis, correctement configuré avec tous les fichiers de mappage hibernate. p>
Vous pouvez déléguer la création de la base de données à hibernate en définissant cette propriété Le message d'erreur est un peu trompeur. Devrait probablement contenir plus d'informations à l'effet de fichiers de cartographie hibernate manquants - mais ceci est une discussion sur le wiki DBUnit. P> org.dbunit.dataset.nosuchTableException: n'a pas trouvé de table 'xxx' dans schema 'yyy' code>. P>
hibernate.hbm2ddl.auto = create-goutte code> dans votre fichier de propriétés. P>
Supprimer la première ligne de votre fichier DataSet.xml P>
et remplacez-le par cette p>
Sinon, DBUNIT tente de charger le schéma des tables DB à partir d'un fichier DTD et si aucune DTD n'est fournie, il ne correspondra jamais sur les tables. L'utilisation de l'en-tête XML ordinaire entraînera DBUnit de sauter cette vérification de la table DTD qui lance l'erreur que vous voyez. P>
Vous devez également faire ce que Grzegorz a fait et avoir hibernate faire une goutte de création pour vos tables en incluant p>
ou p>
code> p>
xml version = '1.0' coding = 'utf-8'?> code> p> p>
configuration.setProperty (environnement.hbm2ddl_auto, "Créer-goutte"); code> p>
C'est ce dont je parle, cela m'a permis énormément, car j'avais l'ensemble de la propriété Create-Drop et la configurait correctement. Dans les versions précédentes de DBUnit, lorsque vous avez utilisé Cela a toujours fonctionné. Depuis que j'ai mis à niveau mon dbunit (en fait, je suis passé d'UNITTILS à la dernière version de Spring-Test-DBunit - je peux le recommander) Cela n'a plus rien travaillé, alors je cherchais mon problème mais je n'ai pas trouvé la cause. Je peux donc confirmer que les travaux de fixation ci-dessus dans la version 1.1.0 de Spring-Test-Dbunit!
Vous pouvez être intéressé par cela. J'ai trouvé cette erreur aussi et en renommant ma table dans l'hibernate.cfg.xml à partir de "message" à "Message", il a été capable de trouver le schéma. P>
laissez-moi savoir si cela fonctionne pour vous aussi. P>
J'ai également rencontré cette même erreur et que le correctif accepté ci-dessus n'a pas réparer mes problèmes. Cependant, j'ai pu trouver la solution.
Ma configuration consistait en DBUnit (2.4), Eclipselink (2.1) en tant que fournisseur JPA, et postgres comme ma base de données de backend. En outre, dans mon scénario, je ne laissais pas tomber et recréer les tables de chaque test. Mes données de test existaient déjà. Mauvaise pratique que je connaisse, mais c'était plus un scénario de test / prototypage. Le code ci-dessous illustre la configuration DBUnit utilisée pour résoudre mon problème. P>
54 // ctx represents a spring context 55 DataSource ds = (DataSource)ctx.getBean("myDatasourceBean"); 56 Connection conn = DataSourceUtils.getConnection(ds); 57 IDatabaseConnection dbUnitConn = new DatabaseConnection(conn, "public"); 58 DatabaseConfig dbCfg = dbUnitConn.getConfig(); 59 dbCfg.setFeature(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE); 60 IDataSet dataSet = new FlatXmlDataSet(ClassLoader.getSYstemResourceAsStream("mydbunitdata.xml")); 61 DatabaseOperation.REFRESH.execute(dbUnitConn, dataSet);
Je pense que la différence est JPA. J'utilisais Hibernate en tandem avec Generic-Hibernate-Dao. Et aussi, je n'ai pas utilisé Eclipselink.
Avec DBUNIT 2.4.5 et UP, il existe un support spécifique pour les postgres, et vous pouvez obtenir ces options simplement à l'aide de: Databaseconfig Dbunitconconfig = dbunitcon.getconfig (); dbunitconconfig.setProperty (DatabasEconfig.property_dataType _Factory, Nouveau PostgresqLDaTatypEfactory ());
Pour que je passe le nom du schéma dans DatabasConnection code> constructeur a résolu le problème même si je l'indique en URL de base de données elle-même.
J'ai couru dans la même erreur et j'ai eu à la fois mon entité configurée dans hibernate.cfg.xml et j'utilisais HBM2DDL pour générer les tables, donc j'ai recherché sur et j'ai constaté que ma cartographie d'entité contenait un champ nommé "position" qui est un terme réservé. Quand je l'ai changé en "POS", la table a été générée correctement. P>
Vous pouvez vérifier si votre table est générée en débogage de l'itération des résultatsS dans P>
org.dbunit.database.databasedaaset.Imitialize (). P>
Les classes DBUnit prennent le schéma par défaut de la base de données, si le schéma que vous souhaitez utiliser n'est pas la valeur par défaut, vous devez définir le schéma souhaité dans le fichier .xml et activer l'option de reconnaissance des autres schémas, voir la solution au dessous de. Je l'ai créé.
exemple.xml - plusieurs schemas p> classe de test p>
Que se passe-t-il si vous prépare le nom du schéma à l'état du nom de la table -> myschema.status?
@LUCIANO FIANDESIO, voulez-vous dire lors de la création d'idatabaseconnection dbunitconn = nouvelle Databaseconnection (connexion, "schéma? Nom")?
Non, je veux dire dans le fichier de jeu de données XML devient
Comment ressemblent votre chaîne de connexion JDBC?
@LUCIANO FIANDESIO: J'ai essayé cela mais obtenez la même erreur. Seulement avec le nom du schéma a été préparé au "Table manquant".