java - interfaz - ¿Cuál es la mejor manera de probar un componente EJB3 sin tener que implementar el componente?
manejo de gridlayout en java (2)
No necesariamente de la manera más fácil, pero logré hacer que esto funcionara usando el contenedor embebible EJB3.0 de JBoss, con gran asistencia de Java Persistence con Hibernate.
Para empezar, no sé de los complementos / dependencias de maven para esto, así que tuve que instalar mi propio localmente:
(1) Descarga jboss-EJB-3.0_Embeddable_ALPHA_9.zip
desde descargas
(2) Este archivo zip contiene dos JAR importantes:
-
jboss-ejb3-all.jar
-
thirdparty-all.jar
(3) Instale estos 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) También necesitaba agregar dependencias para HSQLDB y SLF4J
(7) Debe copiar algunos archivos del directorio conf
del archivo comprimido al directorio src/main/resources
de su proyecto:
-
default.persistence.properties
-
ejb3-interceptors-aop.xml
-
embedded-jboss-beans.xml
-
jndi.properties
(8) beans.xml
mis propios archivos beans.xml
y persistence.xml
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 unitaria como la siguiente, usando información adicional de aquí .
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) Esto usa un simple SLSB 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 mensaje 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.
}
Solo digamos que hay una serie de obstáculos en el camino en este enfoque.
Notablemente para hacer con el orden de las dependencias.
¡¡Buena suerte!!
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, etc., se inyecten localmente. Los enterprise beans no deberían tener que lograr esto. Todos los tipos de inyección deben ser compatibles.
- Me gustaría tener un complemento maven para esto, para que las pruebas se puedan ejecutar desde una versión maven.
- Las transacciones no son necesarias durante las pruebas unitarias, esto requeriría un contenedor completo.
¿Conoces un plugin como este o un framework de prueba? Experiencias con eso?
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.
Puedes 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 este y este . 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 falso que me permite 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 .