Je voudrais avoir un système JUnit (ou autre) où les beans enterprise peuvent être testés dans un environnement fictif afin que toutes les ressources / beans, etc., soient injectées localement. Les beans entreprise ne devraient pas avoir à accomplir cela. Tous les types d’injection doivent être pris en charge.
Connaissez-vous un tel plugin maven ou un framework de test? Des expériences avec ça?
Ce n’est pas forcément la méthode la plus simple, mais j’ai réussi à faire fonctionner cela avec le conteneur EJB3.0 intégrable de JBoss, avec l’aide majeure de Java Persistence avec Hibernate
Pour commencer, je ne connais pas de plugins / dépendances maven pour cela, alors j’ai dû installer le mien localement:
(1) Télécharger jboss-EJB-3.0_Embeddable_ALPHA_9.zip
partir des téléchargements
(2) Ce fichier zip contient deux fichiers JAR importants:
jboss-ejb3-all.jar
thirdparty-all.jar
(3) Installez ces fichiers JAR dans votre référentiel local (utilisez vos propres initiales au lieu de nkl
):
mvn install:install-file \ -Dfile=jboss-ejb3-all.jar \ -DgroupId=nkl.jboss.embedded \ -DartifactId=jboss-ejb3-all \ -Dversion=3.0-alpha-9 mvn install:install-file \ -Dfile=thirdparty-all.jar \ -DgroupId=nkl.jboss.embedded \ -DartifactId=thirdparty-all \ -Dversion=3.0-alpha-9
(4) Si tout s’est bien passé, vous devriez maintenant avoir deux répertoires dans votre référentiel local.
(5) Ajoutez maintenant les dépendances suivantes à votre pom.xml
nkl.jboss.embedded jboss-ejb3-all 3.0-alpha-9 nkl.jboss.embedded thirdparty-all 3.0-alpha-9
(6) J’avais aussi besoin d’append des dépendances pour HSQLDB et SLF4J
(7) Vous devez copier certains fichiers du répertoire conf
du fichier zip dans le répertoire src/main/resources
de votre projet:
default.persistence.properties
ejb3-interceptors-aop.xml
embedded-jboss-beans.xml
jndi.properties
(8) J’ai créé mes propres fichiers beans.xml
et persistence.xml
dans src/main/resources/META-INF
:
java:/messageDS org.hsqldb.jdbcDriver jdbc:hsqldb:test 0 10 1000 30000 org.hibernate.ejb.HibernatePersistence java:/messageDS
(9) J’ai créé un test unitaire comme ci-dessous, en utilisant des informations supplémentaires fournies ici .
package org.nkl; import java.io.File; import javax.naming.InitialContext; import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap; import org.jboss.ejb3.embedded.EJB3StandaloneDeployer; import org.junit.Test; import org.nkl.model.MessageHandler; public class BasicTest { @Test public void testEjb() throws Exception { EJB3StandaloneBootstrap.boot(null); EJB3StandaloneBootstrap.deployXmlResource("META-INF/beans.xml"); EJB3StandaloneDeployer deployer = EJB3StandaloneBootstrap .createDeployer(); deployer.getArchives().add(new File("target/classes").toURI().toURL()); deployer.create(); deployer.start(); InitialContext context = new InitialContext(); MessageHandler messageHandler = (MessageHandler) context .lookup("MessageHandlerBean/local"); messageHandler.saveMessages(); messageHandler.showMessages(); EJB3StandaloneBootstrap.shutdown(); } }
(10) Ceci utilise un simple SLSB comme:
package org.nkl.ejb; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.nkl.model.Message; import org.nkl.model.MessageHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Stateless public class MessageHandlerBean implements MessageHandler { @PersistenceContext private EntityManager em; Logger logger = LoggerFactory.getLogger(MessageHandlerBean.class); public void saveMessages() { logger.info("In saveMessages"); em.persist(new Message("Hello World")); } @SuppressWarnings("unchecked") public void showMessages() { logger.info("In showMessages"); List messages = em.createQuery( "select m from Message m order by m.text asc").getResultList(); for (Object o : messages) { logger.info(((Message) o).getText()); } } }
(11) Et une classe d’entité Message comme:
package org.nkl.model; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name = "MESSAGES") public class Message { @Id @GeneratedValue @Column(name = "MESSAGE_ID") private Long id; @Column(name = "MESSAGE_TEXT") private Ssortingng text; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "NEXT_MESSAGE") private Message nextMessage; public Message(Ssortingng text) { this.text = text; } Message() {} // setters/getters not shown. }
Disons simplement que cette approche présente un certain nombre d’obstacles.
Notamment à faire avec l’ordre des dépendances.
Bonne chance!!
Je dois avertir que JBoss embedded est un gâchis. Tu n’as pas besoin de croire ma parole. Voir les forums pour vous-même. C’est l’alpha par tous les moyens possibles. Les choses peuvent fonctionner pour vous maintenant, mais qui sait quels bugs attendent toujours là … En supposant que votre projet dure encore longtemps … c’est un risque.
Vous pouvez essayer OpenEJB. Il est limité à certains égards (en termes de flexibilité) mais il est vraiment facile à utiliser et totalement conforme à la spécification. Il existe quelques liens tels que ceci et cela . Téléchargez-le et essayez-le. A propos, OpenEJB a attiré mon attention en lisant les messages de JBoss Embedded Forum … de la part d’utilisateurs mécontents, citant des alternatives.
Personnellement, j’ai décidé de créer pour mes projets une sorte de conteneur factice qui me permet de tester presque tout ce dont j’ai besoin. Pour la persistance, j’utilise Hibernate Entity Manager + HSQL. J’ai mis une semaine à mettre en place mais mes équipes (2 à ce jour) en sont très satisfaites. Je vais le rendre open-source si possible.
La dernière option est ejb3unit .