Ir al contenido principal

TUTORIAL ARQUILLIAN (I)

¿Qué es Arquillian?


Arquillian es un framework de test que nos permite levantar un contexto embebido CDI y realizar test unitarios y test funcionales en nuestros proyectos.

En nuestras aplicaciones tenemos que probar componentes cuyo ciclo de vida es manejado por el servidor de aplicaciones como EJB´s o JPA´s y nos volvemos locos perdiendo tiempo en crear mocks o probando estos componentes posteriormente en pruebas funcionales cuando deberían tener sus propias pruebas unitarias.

Con Arquillian vamos a poder probar todos estos componentes levantando un contexto CDI, inyectando estos componentes en la propia clase de test que a su vez correrá dentro del contenedor.   



Se integra fácilmente en nuestros proyectos con Maven y funciona con librerías de test como JUnit 4 o TestNG.  Para desplegar desplegables JAVA (JARS, WARS) con las clases disponibles en el contexto CDI utiliza el framework ShrinkWrap.

Escribiendo un test de integración con Arquillian

Para poder ejecutar test con Arquillian vamos a necesitar tener como mínimo Maven instalado y JDK 1.5. Podemos crear un proyecto Maven en Eclipse con el plugin m2e o crearlo manualmente mediante la línea:


mvn archetype:generate -DarchetypeGroupId=net.avh4.mvn.archetype \
-DarchetypeArtifactId=java-1.6-archetype

y  posteriormente importarlo creando los archivos con el goal eclipse:eclipse.


Una vez que hemos creado el proyecto nos debería aparecer algo como lo siguiente:



En el pom nos debería aparecer lo básico, el plugin para compilar con la JDK 1.6 y la librería de JUnit para los test unitarios:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
            </plugin>
        </plugins>
    </build>
<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
</dependency>
<dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-6.0</artifactId>
            <version>1.0.0.Final</version>
            <type>pom</type>
            <scope>provided</scope>
</dependency>


A continuación creamos en nuestro proyecto un componente el cual utilizaremos para probar  la inyección de dependencias en un servidor embebido (JBOSS, GLASSFISH…):

public class Greeter {

    private PhraseBuilder phraseBuilder;

    @Inject
    public Greeter(PhraseBuilder phraseBuilder) {
        this.phraseBuilder = phraseBuilder;
    }

    public void greet(PrintStream to, String name) {
        to.println(createGreeting(name));
    }

    public String createGreeting(String name) {
        return phraseBuilder.buildPhrase("hello", name);
    }
}

Para añadir el soporte de Arquillian a nuestro proyecto añadimos primero las dependencias transitivas de Arquillian dentro de la sección dependencyManagement:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.arquillian</groupId>
                <artifactId>arquillian-bom</artifactId>
                <version>1.0.3.Final</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>


A continuación añadimos la dependencia que nos servirá de puente para utilizar Arquillian con JUnit 4, que añadirá también las dependencias de ShrinkWrap para desplegar artefactos Java. En este punto hay que decir que tenemos la opción de utilizar Arquillian con otras librerías de pruebas como el framework TestNG:

  <dependency>
            <groupId>org.jboss.arquillian.junit</groupId>
            <artifactId>arquillian-junit-container</artifactId>
            <scope>test</scope>
  </dependency>


Una vez que hacemos esto ya podemos escribir nuestro primer test unitario. Para ello creamos una clase de Test, inyectamos nuestro componente con las anotaciones CDI, creamos y desplegamos con ShrinkWrap un JAR con nuestra clase y un archivo beans.xml vacío pero necesario para que funcione todo correctamente por la especificación JEE 6


El código del test unitario es el siguiente:

@RunWith(Arquillian.class)
public class GreeterTest {

    @Deployment
    public static JavaArchive createDeployment() {
        JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
            .addClasses(Greeter.class, PhraseBuilder.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");     
        return jar;
    }

    @Inject
    Greeter greeter;

    @Test
    public void should_create_greeting() {
        Assert.assertEquals("Hello, Earthling!",
            greeter.createGreeting("Earthling"));
        greeter.greet(System.out, "Earthling");
    }
}

·         @RunWith: el test corre bajo el soporte de Arquillian
·         @Deployment: anotación sobre el método que crea el desplegable Java
·         @Inject: para instanciar nuestro componente en la clase de test
·         @Test: anotación para indicar qué es un método de test


Ahora viene lo mejor. Estos test unitarios deben correr bajo un contenedor pero, ¿Cuál?  Pues podremos elegir varios contenedores compatibles con el modelo de programación de nuestra prueba siempre y cuando exista un adaptador en Arquillian con este contenedor. Para el test de inyección de CDI podremos utilizar JBoss 7, Glassfish 3 o Weld (implemenación de referencia de CDI). Arquillian también permite ejecutar los test con un servidor real sin cambiar una sola línea de código (previamente a las pruebas deberemos tener levantado dicho servidor). Si utilizamos por ejemplo Glassfish 3 deberemos añadir las siguientes dependencias:

<dependency>
                    <groupId>org.jboss.arquillian.container</groupId>
                    <artifactId>arquillian-glassfish-embedded-3.1</artifactId>
                    <version>1.0.0.CR3</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.glassfish.main.extras</groupId>
                    <artifactId>glassfish-embedded-all</artifactId>
                    <version>3.1.2</version>
                    <scope>provided</scope>
                </dependency>

Para resumir el tema de las dependencias están:

·       La dependencia de integración de Arquillian y JUnit.:

<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>


·       La dependencia de Arquillian para el contenedor:

<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-glassfish-embedded-3.1</artifactId>
       <version>1.0.0.CR3</version>
      <scope>test</scope>
</dependency>

·         Y el ambiente de ejecución del contenedor:

<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.2</version>
<scope>provided</scope>
</dependency>


Finalmente probamos nuestro test en Eclipse ejecutándolo como un test unitario normal: Run As Junit Test.

Comentarios

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Pe...

Soluciones Alchemy Classic 442 elementos

Después de la resaca navideña y de la cuesta de enero, volvemos para informar la agradable sorpresa que nos ha dado a los fans de Alchemy Classic la empresa NIASOF ,  tras actualizar el juego Alchemy Classic. Una nueva versión con 442 elementos , interfaz mejorada de grupos y lo más importante, nuevos elementos que descubrir. La gran novedad de esta actualización son los puntos que tienes asignados , con los que puedes  conseguir pistas sobre los elementos que no has abierto todavía como: Conseguir un subelemento de un elemento, con 100 puntos . Conseguir el grupo de un subelemento de un elemento (qué lío , jeje), con 35 puntos . Me gusta, me gusta el enfoque de esta nueva versión aunque los elementos que han sacado me parecen poco originales. Parece que se van agotando las ideas para los elementos nuevos. Aquí van las soluciones: Carbon = Tierra + Turba Sol = Estrella + Tierra Espacio = 3 x Estrella Estrella = Helio + Hidrógeno Oso Pa...

Alchemy Classic

Dentro de los juegos que he descargado con el Android Market hay dos que destacan sobre todos los demás. El primero es Angry Birds (pájaros furiosos), en el cual comandas un ejercito de pájaros para luchar con una piara de cerdos malotes los cuales han robado sus huevos. Básicamente, tienes que ir pasando nivel tras nivel afinando tu puntería lanzando los pájaros a los cerdos que se esconden tras maderas, cristales y piedras. Pero la verdadera joya que no es tan conocida es Alchemy Classic . En este juego puedes desempeñar el papel  de Dios. Comenzando con 4 elementos básicos, Aire, Agua, Tierra y Fuego tienes que ir obteniendo todos los demás elementos de la creación (animales, plantas, herramientas...) mediante la combinación de los 4 primeros. En total hay 238 elementos. Después de una semana y alguna noche sin dormir por fin los he obtenido todos. El último elemento me ha llevado más de la cuenta por su maravillosa traducción. ¿Qué son abrojos? ¿Lo sabéis? Pues no, ...