2009-02-16 14 views
13

Me gustaría tener un sistema JUnit (u otro) donde los enterprise beans puedan probarse en un entorno simulado para que todos los recursos/beans y etc. se inyectan localmente Los enterprise beans no deberían tener que lograr esto. Todos los tipos de inyección deben ser compatibles.Cuál es la mejor manera de probar un componente EJB3 sin tener que implementar el componente

  • Me gustaría tener un plugin maven para esto para que las pruebas se puedan ejecutar desde una compilación maven.
  • Las transacciones no son necesarias durante las pruebas unitarias, esto requeriría un contenedor completo .

¿Conoces este plugin o framework de prueba? Experiencias con eso?

Respuesta

12

No necesariamente la forma más fácil, pero me las arreglé para conseguir este funcionamiento el uso de contenedores EJB3.0 integrable de JBoss, con la asistencia de los principales Java Persistence with Hibernate

Para empezar, no sé de plugins de Maven/dependencias de este , así que tuve que instalar mi propio local:

(1) Descarga de jboss-EJB-3.0_Embeddable_ALPHA_9.zipdownloads

(2) Este archivo zip contiene dos archivos JAR importantes:

  • jboss-ejb3-all.jar
  • thirdparty-all.jar

(3) Instalar estos archivos JAR en su repositorio local (use sus propias iniciales en lugar 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 todo ha ido bien, ahora debería tener dos directorios en su repositorio local.

(5) Ahora agregue las siguientes dependencias a su pom.xml

<dependency> 
     <groupId>nkl.jboss.embedded</groupId> 
     <artifactId>jboss-ejb3-all</artifactId> 
     <version>3.0-alpha-9</version> 
    </dependency> 
    <dependency> 
     <groupId>nkl.jboss.embedded</groupId> 
     <artifactId>thirdparty-all</artifactId> 
     <version>3.0-alpha-9</version> 
    </dependency> 

(6) que también tenía que añadir dependencias de HSQLDB y SLF4J

(7) Es necesario copiar algunos archivos de el directorio conf del archivo zip en el directorio src/main/resources de su proyecto:

  • default.persistence.properties
  • ejb3-interceptors-aop.xml
  • embedded-jboss-beans.xml
  • jndi.properties

(8) he creado mis propias beans.xml y persistence.xml archivos en src/main/resources/META-INF:

<?xml version="1.0" encoding="UTF-8"?> 
<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" xmlns="urn:jboss:bean-deployer"> 
    <bean name="messageDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> 
    <property name="jndiName">java:/messageDS</property> 
    <property name="driverClass">org.hsqldb.jdbcDriver 
    </property> 
    <property name="connectionURL">jdbc:hsqldb:test</property> 
    <property name="minSize">0</property> 
    <property name="maxSize">10</property> 
    <property name="blockingTimeout">1000</property> 
    <property name="idleTimeout">30000</property> 
    <property name="transactionManager"> 
     <inject bean="TransactionManager" /> 
    </property> 
    <property name="cachedConnectionManager"> 
     <inject bean="CachedConnectionManager" /> 
    </property> 
    <property name="initialContextProperties"> 
     <inject bean="InitialContextProperties" /> 
    </property> 
    </bean> 
    <bean name="messageDS" class="java.lang.Object"> 
    <constructor factoryMethod="getDatasource"> 
     <factory bean="messageDSBootstrap" /> 
    </constructor> 
    </bean> 
</deployment> 

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
    version="1.0"> 
    <persistence-unit name="jpa"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:/messageDS</jta-data-source> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

(9) creé una prueba de unidad como el siguiente, usando información adicional de here.

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) Este utiliza un SLSB simple como:

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) y una clase de entidad de mensajes como:

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 String text; 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "NEXT_MESSAGE") 
    private Message nextMessage; 

    public Message(String text) { 
     this.text = text; 
    } 

    Message() {} 

    // setters/getters not shown. 

} 

Digamos que hay una número de obstáculos en el camino en este enfoque.

Notablemente para hacer con el orden de las dependencias.

¡Buena suerte!

+1

para realizar pruebas unitarias, debe hacerse al costado del contenedor? –

+0

todos estos no funcionan en jbossAS7 en absoluto. Parece que el libro ahora está demasiado desactualizado. ¿Sabes cómo hacerlo funcionar en JBoss AS 7? Específicamente, no puedo encontrar ninguna alternativa a 'EJB3StandaloneBootstrap.deployXmlResource' – linuxeasy

4

Debo advertir que JBoss incrustado es un desastre. No necesitas creer en mi palabra. Vea los foros por usted mismo. Es alfa por todos los medios posibles. Las cosas pueden funcionar para usted ahora, pero quién sabe qué errores siguen esperando allí ... Suponiendo que su proyecto viva durante mucho tiempo ... eso es un riesgo.

Puede probar OpenEJB. Es limitado en algunos aspectos (en términos de flexibilidad) pero es realmente fácil de usar y cumple con la especificación. Hay algunos enlaces como this y this. Descárguelo y pruébelo. Por cierto, OpenEJB captó mi atención al leer publicaciones de JBoss Embedded Forum ... de usuarios enojados que señalaban alternativas.

Personalmente, decidí crear para mis proyectos una especie de contenedor simulado que me permitiera probar casi cualquier cosa que necesite. Para la persistencia uso Hibernate Entity Manager + HSQL. Me llevó una semana implementarlo, pero mis equipos (2 hasta ahora) están muy contentos con eso. Lo haré de código abierto si es posible.

La última opción es ejb3unit.

+0

. Me interesa ver cuál es el arnés de prueba si es posible. – cwash

Cuestiones relacionadas