Comment configurer JPA pour les essais dans Maven
Est-il un moyen de mettre en place une deuxième persistence.xml fichier dans un projet Maven tel qu'il est utilisé pour les essais au lieu de la normale qui est utilisé pour le déploiement?
J'ai essayé de mettre un persistence.xml dans src/test/resources/META-INF, ce qui est copié dans target/test-classes/META-INF, mais il semble target/classes/META-INF (le copier dans le répertoire src/main/resources) est préféré, en dépit de mvn -X test
liste le classpath entrées dans le bon ordre:
[DEBUG] Test Classpath :
[DEBUG] /home/uqpbecke/dev/NetBeansProjects/UserManager/target/test-classes
[DEBUG] /home/uqpbecke/dev/NetBeansProjects/UserManager/target/classes
[DEBUG] /home/uqpbecke/.m2/repository/junit/junit/4.5/junit-4.5.jar
...
Je voudrais être en mesure d'exécuter des tests par rapport à un simple hsqldb de configuration sans avoir à changer le déploiement de la version de la configuration JPA, idéalement directement après le projet de la caisse, sans besoin de locaux à peaufiner.
Vous devez vous connecter pour publier un commentaire.
La suite va travailler pour Maven 2.1+ (avant qu'il n'y avait pas de phase entre l'épreuve et le package que vous pouvez lier une exécution).
Vous pouvez utiliser le maven-antrun-plugin pour remplacer la persistence.xml avec la version d'essai pour la durée des tests, puis rétablir la bonne version avant que le projet est emballé.
Cet exemple suppose que la version de production est src/main/resources/META-INF/persistence.xml et la version de test est src/test/resources/META-INF/persistence.xml, de sorte qu'ils seront copiés dans target/classes/META-INF et cible/test-classes/META-INF respectivement.
Il serait plus élégant de l'encapsuler dans un mojo, mais comme vous êtes la seule copie d'un fichier, il semble exagéré.
Dans un EE6/CDI/JPA projet, un test
src/test/resources/META-INF/persistence.xml
est ramassé, tout beaux, sans aucune configuration supplémentaire.Lors de l'utilisation de JPA au Printemps, les travaux suivants dans le contexte de l'application utilisée pour le test:
Ici,
/src/test/resources/META-INF/persistence.xml
(copié danstarget/test-classes
) seraient préférables/src/main/resources/META-INF/persistence.xml
(copié danstarget/classes
).Malheureusement, l'emplacement de la
persistence.xml
fichier détermine également la soi-disant "unité de persistance de la racine", qui détermine les classes qui sont analysés pour@Entity
annotations. Ainsi, l'utilisation de/src/test/resources/META-INF/persistence.xml
numériser des classes danstarget/test-classes
, et non des classes danstarget/classes
(où les classes qui doivent être testés vivraient).Donc, pour les essais, on aurait besoin d'ajouter explicitement
<class>
entrées àpersistence.xml
, pour éviterjava.lang.IllegalArgumentException: Not an entity: class ...
. La nécessité pour<class>
entrées peuvent être évités par l'utilisation d'un nom de fichier différent, commepersistence-TEST.xml
, et de mettre ce fichier dans le même dossier que l'ordinaire depersistence.xml
fichier. Le Printemps de contexte à partir de votre dossier de test peut alors tout simplement se référer à<property name="persistenceXmlLocation" value="META-INF/persistence-TEST.xml" />
, et le Printemps va le trouver pour vous danssrc/main
.Comme une alternative, on pourrait être en mesure de garder
persistence.xml
la même pour l'application et les tests, et seulement de définir un danssrc/main
. La plupart de configuration tels que les pilotes, le dialecte et facultatif des informations d'identification qui peut être fait au Printemps contexte à la place. Également des paramètres tels quehibernate.hbm2ddl.auto
peut être adoptée dans le contexte:Il semble que plusieurs persistence.xml fichiers est un problème général avec JPA, résolu seulement par classloading astuces.
Une solution qui fonctionne pour moi est de définir plusieurs unités de persistance dans un persistence.xml fichier et assurez-vous que votre déploiement et test de code à utiliser une autre liaison (au Printemps, vous pouvez définir le "persistenceUnitName" propriété de l'entité gestionnaire de l'usine). Il pollue votre fichier de déploiement avec la configuration de test, mais si vous n'avez pas l'esprit qu'il fonctionne ok.
Ajouter un persistance.xml pour les tests:
/src/test/resources/META-INF/persistence.xml
Comme @Arjan dit, cela changerait la persistance de l'unité de la racine et les classes d'entité serait balayé dans la cible/test-classes. Pour gérer cela, il faut ajouter jar-file élément à ce persistance.xml:
/src/test/resources/META-INF/persistence.xml
Ensuite, ajouter le filtrage des ressources de test pour votre pom.xml:
Cela fonctionne parce que jar-file pouvez cibler répertoires, non seulement pour les fichiers jar.
plugins
élément xml. Voici une page avec un exemple de pom.xml oùtestResources
élément est présent.J'ai essayé le ClassLoaderProxy approche, mais il avait le problème de la JPA annoté classes ne sont pas traitées comme les classes persistantes par hibernate.
Donc décidé de l'essayer sans aide persistence.xml. L'avantage, c'est que le build maven et Eclipse, JUnit test fonctionne sans modifications.
J'ai un persitent classe de soutien pour JUnit test.
Mes classes de test juste étendre PersistenceTestSupport et appeler le setup() dans le cas de test.setup().
Le seul inconvénient est de garder les classes persistantes jusqu'à ce jour, mais pour JUnit test de ce qui est acceptable pour moi.
Je préfère la solution de l'utilisation de différents persistence.xml pour les essais et la production aussi Riche Vendeur post (merci!!).
Mais besoin de changer:
pour:
Afin de persistance.xml.bon pas incorporé .fichier jar
De conserver deux copies de persistence.xml fichier. L'un pour les tests et l'autre pour les normale de construire.
La valeur par défaut du cycle de vie de copier le construire persistence.xml à la src/test/resources/META-INF
Créer un profil distinct qui lorsqu'il est exécuté copie le test persistence.xml à la src/test/resources/META-INF
Persistence.xml est utilisé comme un point de départ à la recherche pour les classes d'entité, sauf si vous avez la liste de toutes les classes de façon explicite et les ajouter .
Donc, si vous voulez remplacer ce fichier par un autre, disons de la src/test/resources, vous devez spécifier à chaque classe d'entité dans cette deuxième persistence.xml sinon pas de classe d'entité serait trouvée.
Une autre solution serait de remplacer le fichier à l'aide de l'maven-ressources-plugin ("copier-ressources de but). Mais alors vous devez le remplacer par deux fois, une fois pour les tests (par exemple, la phase du processus de test-classes) et une fois pour le réel de l'emballage (phase "préparez-package").
Cette réponse peut sembler idiot, mais je cherchais un moyen qui me permet d'exécuter ces tests à partir d'eclipse par
Run As
->JUnit Test
. C'est comment j'ai fait:Je suis juste la copie de la test/persistence.xml pour classes/persistence.xml. Les travaux de cette.
target/test-classes/META-INF/persistence.xml
surtarget/classes/META-INF/persistence.xml
, donc JPA serait de n'analyser que les classes de latarget/test-classes
, ne sont pas ceux detarget/classes
(ce qui peut être gênant quand on s'appuie sur@Entity
annotations).Je suis en train de faire la même chose. J'ai une solution qui fonctionne pour moi - vous peut varier (et vous risquez de ne pas aimer la solution... c'est un peu bas niveau).
Je suis tombé sur un article sur le net où ils ont été à l'aide d'un personnalisé du chargeur de classe pour faire quelque chose de similaire qui a servi comme source d'inspiration. Si quelqu'un peut voir comment améliorer ensuite les suggestions sont les bienvenue btw. Pour le déploiement, je m'appuie sur le conteneur d'injection de l'EntityManager, mais pour les essais j'ai créer moi-même à l'aide de ce code:
Puis le ClassLoaderProxy est aussi minime que vous pouvez obtenir et juste redirige les demandes de META-INF/persistence.xml pour META-INF/test-persist.xml:
Juste pour expliquer un peu plus:
J'ai été à l'origine de frapper certains problèmes parce que Hibernate va revenir (en quelque sorte) pour le chargeur de classe qui a été utilisé pour charger mise en veille prolongée (au moins je pense que c'est ce qui se passait). J'ai trouvé que le fait de mettre le chargeur de classe code de commutation (premier bloc) comme un bloc statique dans votre cas de Test, il sera chargé avant Hibernate, mais qui, en fonction de votre structure de test vous pouvez aussi avoir besoin de mettre le même code dans d'autres lieux (beurk).
Une autre approche est d'utiliser une persistence.xml pour le test (test/../META-INF/persistence.xml mais remplacer le Scanner comme suit: -
test persistence.xml doit contenir
<property name="hibernate.ejb.resource_scanner" value = "...TestScanner" />
De Code pour la nouvelle classe TestScanner est comme suit.
Lors de l'utilisation d'OpenEJB, persistence.xml peut être remplacé par suppléant descripteurs: http://tomee.apache.org/alternate-descriptors.html
C'est une extension de Riches Vendeur de répondre avec la bonne manipulation des Hibernate trouver de multiples persistence.xml les fichiers sur le chemin de la classe et de pré-test de l'état de la restauration.
De l'installation:
Créer une persistance fichier de déploiement/de l'emballage et de l'autre pour le tester:
src/main/resources/persistence.xml
src/test/ressources/persistence-tests.xml
dans votre pom.xml ajouter à la section plugins:
Avantages par rapport à d'autres solutions
Une autre option pour ce cas d'utilisation serait l'ajout de plusieurs unités de persistance, un pour permet de dire que la production et l'autre pour les tests et d'injecter de l'EntityManagerFactory en conséquence.
Lieu à la fois de la persistance-unités dans le persistence.xml du projet lui-même et avoir vos cas de test injecter la bonne EntityManager. L'exemple ci-dessous illustre comment le faire avec guice. Veuillez noter que j'ai laissé dans certains mockito moqueur pour être complet, le mockito code spécifique a été marquée en conséquence, et n'est pas nécessaire pour l'injection.
mettre des tests en propre projet maven avec ses persistence.xml
Je suggérerais à l'aide de différents profils maven où vous pouvez filtrer votre base de données.proprerties fichiers, et d'une base de données.propriétés en fonction du profil.
De cette façon, vous n'avez pas à garder des doubles de toutes les autres fichiers de configuration à l'exception de l' .les propriétés.
Avec l'aide de surefire pour les tests unitaires et failsfe pour les tests d'intégration, vous avez terminé.
Maintenant, vous avez juste besoin de
mvn test
pour vos tests unitaires etmvn verify -Pintegration
pour vos tests d'intégration.Évidemment, vous devez créer la base de données.des fichiers de propriétés spécifiées (sur les profils) chemins (ou ailleurs et modifier les chemins d'accès)
Basé sur la référence: http://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/