Unit Test para EJB 3.1

NetBeans 6.8 viene con una (de muchas) característica novedosa: Pruebas Unitarias para EJB 3.1.
Para ello, primero recordemos lo siguiente:
  1. EJB 3.1 es parte de Java EE 6
  2. Glassfish V3 implementa Java EE 6
  3. NetBeans 6.8 tiene soporte para Java EE 6, y por tanto también a Glassfish V3
Hecha esta aclaración, probemos lo siguiente: Hacer un módulo ejb para GF3 llamado CalculadoraModule.



Ahora, recordemos algunas de las características del EJB 3.1:
  1. Existen los @Singleton que son como un Stateless pero único y perpetuo en el contenedor. Permite también sincronización para evitar "datos cruzados".
  2. Ya no requiere de una interfaz como local o remote, puede ser una clase y nada más.
  3. Para acceder a través de un JDNI no se necesitará de direcciones raras según sea el contenedor. Todas serán "globales" para un mismo estándar.

Hecho el recordatorio, crearemos un SessionBean pero que sea Singleton y que no sea ni local ni remote. Este Bean se llamará "SeriesBean"



Para nuestro ejemplo, crearemos un método llamado "factorial" que hace justamente eso: calcular el factorial

package ejb;

import javax.ejb.LocalBean;
import javax.ejb.Singleton;

@Singleton
@LocalBean
public class SeriesBean {

    public long factorial(long base) {
        if (base < 1) {
            return 1;
        }
        return factorial(base - 1) * base;
    }
}


Con la clase recién creada y seleccionada, entramos a la opción del menú principal: Tools > Create JUnit Tests. Seleccionamos a JUnit 4.x. Luego, en la ventana de creación de la prueba, seleccionar al menos las siguientes opciones: Method Access Level: Public, Generated Code: Default Method Bodies

Clic en OK, y veamos la clase que ha creado.

package ejb;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

public class SeriesBeanTest {

    public SeriesBeanTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Test
    public void testFactorial() throws Exception {
        System.out.println("factorial");
        long base = 0L;
        SeriesBean instance = (SeriesBean)javax.ejb.embeddable.EJBContainer.createEJBContainer().getContext().lookup("java:global/classes/SeriesBean");
        long expResult = 0L;
        long result = instance.factorial(base);
        assertEquals(expResult, result);
        fail("The test case is a prototype.");
    }

}

Modifiquemos un poco el código para ver si es cierto que nos ha creado un JUnit para un EJB.

    @Test
    public void testFactorial() throws Exception {
        System.out.println("factorial");
        long base = 20;
        SeriesBean instance = (SeriesBean)javax.ejb.embeddable.EJBContainer
                .createEJBContainer()
                .getContext()
                .lookup("java:global/classes/SeriesBean");
        long expResult = 2432902008176640000L;
        long result = instance.factorial(base);
        assertEquals(expResult, result);
    }


Ejecutamos la prueba con Alt+F6 y listo.


Ahora podemos crear y probar EJBs con más comodidad.

Comentarios

Entradas más populares de este blog

UML en NetBeans

Cambiar ícono a un JFrame

RESTful... la forma más ligera de hacer WebServices (Parte 1)