Quelle est la meilleure façon de tester un composant EJB3 sans avoir à déployer le composant?

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.

  • Je voudrais avoir un plugin Maven pour cela afin que les tests puissent être exécutés à partir d’une construction Maven.
  • Les transactions ne sont pas nécessaires lors des tests unitaires, cela nécessiterait un conteneur complet.

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 .