EJB 3.0 y pruebas unitarias con Maven, JUnit 4 y Apache Open EJB.

1
16858

EJB 3.0 y pruebas unitarias con Maven, JUnit 4 y Apache Open EJB.

0. Índice de contenidos.

1. Introducción.

Apache OpenEJB es un contenedor de EJBs de código abierto, ligero e integrable,
liberado bajo la Licencia Apache 2.0. Como tal, ha sido integrado en servidores de aplicaciones J2EE como
Gerónimo o WebObjects.

Para nuestros propósitos vamos a utilizarlo como un microcontenedor de EJBs que nos permita ejecutar pruebas unitarias con JUnit y el soporte de Maven.

Hasta ahora, habíamos estado usando Embedded Jboss en sus versiones 2
y 3, solucionando problemas diversos a la hora de ejecutar
tests de persistencia.
En este tutorial vamos a comprobar la sencillez de pasar a OpenEJB y nos olvidaremos de todos los problemas de configuración y de subidas de versiones de la JVM que hemos tenido con Embedded Jboss.

Este tutorial se basa en los anteriores de Embedded Jboss en el sentido que prueba los mismos EJBs, pero ahora con OpenEJB, con lo que para obtener el código de los mismos a aquellos me remito.

2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Asus G1 (Core 2 Duo a 2.1 GHz, 2048 MB RAM, 120 GB HD).
  • Sistema operativo: Windows Vista Ultimate.
  • JDK 1.6.0_14
  • Maven 2.1.
  • Apache OpenEJB 3.1.

3. Configuración.

La configuración es bastante más simple, puesto que no hay que descargarse ningún binario y montarlo en el entorno de test, basta con incluir las siguientes
dependencias en nuestro pom.xml con el scope de test:

El resto de dependencias son las mismas que con Embedded Jboss pero sustituyendo las propias de org.jboss.embedded por estas y añadiendo, además, la
siguiente:

The Simple Logging Facade for Java or (SLF4J) proporciona una fachada o abstración para varios frameworks de logging como java.util.logging, log4j and logback,
permitiendo elegir el concreto en tiempo de desarrollo (echando uno u otro jar).

4. Test de EJBs locales y remotos.

El siguiente test cubre nuestras necesidades. Si lo comparamos con el test que corre bajo Embedded Jboss ahora no se requiere el despliegue de un jar montado
dentro de un directorio virtual, OpenEJB se limita a escanear las librerías del classpath en busca de jar que contengan EJBs, con lo que no hay que desplegar
manualmente nada. Para que reconozca un jar como un módulo EJB basta con que encuentre un fichero ejb-jar.xml en el directorio META-INF del mismo, el contenido,
en principio, es indiferente, puede estar vacío y solo contener «<ejb-jar />».

No se requiere una comprobación del estado del microcontenedor, ni un arranque manual. Lo único necesario es la asignación de la propiedad «org.apache.openejb.client.LocalInitialContextFactory»
como factoría del contexto de nombres, aunque también podría estar en un fichero jndi.properties.

Con la instancia de javax.naming.Context podemos obtener las referencias a los EJBs para los tests, teniendo en cuenta que, por defecto
OpenEJB publica los EJBs con el nombre NombreDelEjbTipodeinterfaz; de ahí que el SLSB que nosotros llamamos DummyGreeterBean
se publique como DummyGreeterBeanLocal y DummyGreeterBeanRemote.

5. Test de EJBs de entidad.

Para la ejecución de los tests de persistencia no hemos tenido que realizar modificaciones significativas, salvo crear programáticamente un datasource
con el nombre DefaultDS, que tendrá el nombre jndi java:openejb/Resource/DefaultDS, al que ya hacíamos referencia en el fichero persistence.xml.

Con ello quedan cubiertas nuestras necesidades.

6. Conclusiones.

Mucho más simple y muchos menos quebraderos de cabeza.

Si nuestro servidor de aplicaciones es Jboss Server tiene sentido que en el entorno de tests usemos su versión Embedded, aunque después de ver la sencillez con la que
podemos montar el entorno de tests con OpenEJB, quizás deje de tenerlo.

Un saludo.

Jose

mailto:jmsanchez@autentia.com

1 Comentario

  1. Hola Jose Manuel…
    Estoy haciendo unos tests justo con OpenEJB, pero a la final el test me lanza siempre un

    org.hibernate.PersistentObjectException: detached entity passed to persist: it.f2informatica.rc.ejb.entities.Role

    El DAO, la transaccionalidad y los EJB creo tenerlos hechos correctamente, uso Hibernate… Si es un error comun quizas me darias un enderezada, gracias 😉

Dejar respuesta

Please enter your comment!
Please enter your name here