En teoría, Arquillian permite escribir tests de integración para varios servidores utilizando el mismo código y con unos cambios mínimos de configuración.
En este blog mi objetivo es usar Arquillian con TomEE en lugar de WildFly, y ver qué cambios debemos realizar para ejecutar el mismo test Hola Mundo que ya vimos en WildFly.
El objetivo es detallar todos y cada uno los cambios de configuración entre TomEE embedded y WildFly embedded.
1.Configuración de dependencias
Dado que no usamos ninguna funcionalidad específica de ningún servidor de aplicaciones, las dependencias de compilación y de test son las mismas que en el proyecto para WildFly.
En teoría, lo único que debería cambiar a nivel de dependencias son las librerías del runtime de Tomee (cambio #1), necesarias para arrancar y ejecutar TomEE en lugar de WildFly.
Modificaremos build.gradle
para utilizar org.apache.openejb:arquillian-tomee-embedded:1.7.1
, como sigue:
// ***************************************************************************** // TomeePlume: embedded testRuntime 'org.apache.openejb:arquillian-tomee-embedded:1.7.1'
Sin embargo, en la práctica, al ejecutar los test, nos encontramos con un error, java.lang.ClassFormatError
, que se soluciona cambiando la dependencia de la API de JEE6 a javax:javaee-api:6.0
(cambio #2) para TomEE.
Como WildFly funciona perfectamente contra esta dependencia, este es más bien un cambio a hacer a la configuración de WildFly que a la de TomEE.
2. Código
3. Configuración de Runtime
Aunque tocaría ahora, ya hemos cambiado las dependencias para ejecutar TomEE en lugar de WildFly más arriba.
Por supuesto, debemos cambiar el archivo arquillian.xml
para configurar el servidor embedded de Tomee (cambio #3), que quedará como sigue:
<?xml version="1.0" encoding="UTF-8"?> <arquillian xmlns="http://jboss.org/schema/arquillian" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"> <container qualifier="tomee" default="true"> <configuration> </configuration> </container> </arquillian>
Y, sí, no hace falta configurar ningún parámetro para usar el TomEE embedded.
Otra cosa a tener en cuenta es que en la versión de WildFly con el adaptador embedded era obligatorio pasar a la máquina virtual del servidor el parámetro java.util.logging.manager
, seleccionando el log manager de WildFly. Pero dicho gestor no está disponible en TomEE, por lo que no arrancará.
Solución: no pasar el parámetro java.util.logging.manager
al runtime de TomEE (cambio #4).
4. Ejecutar tests
Se ejecutan exactamente igual.
En resumen
Hemos tenido que hacer cuatro cambios para poder lanzar el test más simple posible usando un bean EJB.
En realidad, si actualizamos la versión de WildFly para que use la dependencia org.apache.openejb:javaee-api:6.0-4
como API de JEE 6, con la que funciona perfectamente, el número de cambios es de 3, todos ellos triviales.
No está nada mal, ¿no?
Notas
Como nota aparte, comentar que Gradle tardó en ejecutar el test contra TomEE 5.856 segundos. El mismo test, lanzado contra WildFly con la configuración standalone.xml
tardó 9.443 segundos.
Los tiempos en numerosas ejecuciones se mantuvieron siempre en torno a estos valores, con variaciones de no más de 1 segundo. Es una diferencia notable y que vale la pena mencionar, pero tampoco le daría mucha importancia, ya que el nuestro no es un escenario realista.
Software utilizado
Esto ha sido probado con TomeePlume 1.7.1 y Arquillian 1.1.8, usando Gradle 2.3.