Diferencia entre revisiones de «MockEjb Con Spring»

De Dos Ideas.
Saltar a: navegación, buscar
(Ejemplo)
(Ejemplo: mock de un EJB)
Línea 3: Línea 3:
 
Para esto, teniendo en cuenta el uso de [[Ejb Con Spring]], los pasos a seguir serán simples: en la creación del Test, iniciaremos el contexto de [[MockEjb]]. De esta manera, el [[JndiTemplate]] de Spring obtendrá los Ejb de nuestro Mock.
 
Para esto, teniendo en cuenta el uso de [[Ejb Con Spring]], los pasos a seguir serán simples: en la creación del Test, iniciaremos el contexto de [[MockEjb]]. De esta manera, el [[JndiTemplate]] de Spring obtendrá los Ejb de nuestro Mock.
  
==Ejemplo: mock de un EJB==
+
==Ejemplo==
 
===El EJB===
 
===El EJB===
 
Supongamos que tenemos un EJB llamado ''PersonaServiceBean''. Esta EJB está compuesto de las siguiente clases:
 
Supongamos que tenemos un EJB llamado ''PersonaServiceBean''. Esta EJB está compuesto de las siguiente clases:
Línea 9: Línea 9:
 
* com.dosideas.business.ejb.persona.PersonaServiceRemote (interfaz de negocio remota)
 
* com.dosideas.business.ejb.persona.PersonaServiceRemote (interfaz de negocio remota)
 
* com.dosideas.business.ejb.persona.PersonaServiceBean (implementación del EJB)
 
* com.dosideas.business.ejb.persona.PersonaServiceBean (implementación del EJB)
 +
 +
Este EJB hereda de la clase ''AbstractStatelessSessionBean'', lo que permite integrar un [[EJB Con Spring]]. Estos EJB esperan encontrar en el contexto una variable ''ejb/BeanFactoryPath'' que apunte a los archivos de configuración de Spring.
  
 
===Archivo de configuración de Spring===
 
===Archivo de configuración de Spring===
Línea 36: Línea 38:
  
 
=== El test ===
 
=== El test ===
 +
En este Test, realizaremos las siguentes tareas:
 +
# En el constructor, inicializamos MockEjb, configuramos la variable de entorno para Spring, y desplegamos el EJB en el container mock.
 +
# En el método ''setearDependencias()'' buscamos el EJB utilizando Spring. Aquí podríamos hacer el lookup directamente del EJB, sin Spring, y accederiamos igualmente a MockEjb.
 +
# Finalmente, en el método ''decirHola()'' invocamos al EJB.
  
 
<pre>
 
<pre>
public class PersonaServiceBeanSpringTest extends AbstractDependencyInjectionSpringContextTests {
+
@RunWith(SpringJUnit4ClassRunner.class)
 +
@ContextConfiguration(locations = {
 +
    "/application.xml" })
 +
public class PersonaServiceBeanTest extends AbstractJUnit4SpringContextTests  {
  
 
     private static final String NOMBRE_JNDI = "ejb/PersonaServiceBean";
 
     private static final String NOMBRE_JNDI = "ejb/PersonaServiceBean";
Línea 45: Línea 54:
 
     private PersonaServiceRemote personaService;
 
     private PersonaServiceRemote personaService;
  
    @Override
 
    protected String[] getConfigLocations() {
 
        return new String[]{"classpath:application.xml"};
 
    }
 
  
 
     public PersonaServiceBeanSpringTest(String testName) throws NamingException {
 
     public PersonaServiceBeanSpringTest(String testName) throws NamingException {
Línea 57: Línea 62:
 
         MockContextFactory.setAsInitial();
 
         MockContextFactory.setAsInitial();
 
         Context context = new InitialContext();
 
         Context context = new InitialContext();
 +
        context.bind("java:comp/env/ejb/BeanFactoryPath", "classpath:application.xml");
  
 
         MockContainer mockContainer = new MockContainer(context);
 
         MockContainer mockContainer = new MockContainer(context);
Línea 68: Línea 74:
 
     }
 
     }
  
     @Override
+
 
     protected void onSetUp() throws Exception {
+
     @Before
 +
     protected void setearDependencias() throws Exception {
 
         personaService = (PersonaServiceRemote) applicationContext.getBean("ejb.PersonaServiceBean");
 
         personaService = (PersonaServiceRemote) applicationContext.getBean("ejb.PersonaServiceBean");
 
     }
 
     }
 +
  
 
     /**
 
     /**
Línea 77: Línea 85:
 
     * Spring obtendra el Ejb, hacinedo un lookup contra MockEjb configurado en el constructor del test.
 
     * Spring obtendra el Ejb, hacinedo un lookup contra MockEjb configurado en el constructor del test.
 
     */
 
     */
     public void testDecirHola() throws Exception {
+
    @Test
 +
     public void decirHola() throws Exception {
 
         System.out.println("decirHola");
 
         System.out.println("decirHola");
 
         String nombre = "Zim";
 
         String nombre = "Zim";

Revisión del 15:27 1 ago 2008

Es posible integrar el uso de Spring Framework con MockEjb, de forma tal que se pueda realizar la Prueba De Integracion de EJB sin necesidad de utilizar un Servidor de Aplicaciones.

Para esto, teniendo en cuenta el uso de Ejb Con Spring, los pasos a seguir serán simples: en la creación del Test, iniciaremos el contexto de MockEjb. De esta manera, el JndiTemplate de Spring obtendrá los Ejb de nuestro Mock.

Ejemplo

El EJB

Supongamos que tenemos un EJB llamado PersonaServiceBean. Esta EJB está compuesto de las siguiente clases:

  • com.dosideas.business.ejb.persona.PersonaServiceRemoteHome (interfaz Home remota)
  • com.dosideas.business.ejb.persona.PersonaServiceRemote (interfaz de negocio remota)
  • com.dosideas.business.ejb.persona.PersonaServiceBean (implementación del EJB)

Este EJB hereda de la clase AbstractStatelessSessionBean, lo que permite integrar un EJB Con Spring. Estos EJB esperan encontrar en el contexto una variable ejb/BeanFactoryPath que apunte a los archivos de configuración de Spring.

Archivo de configuración de Spring

Supongamos el siguiente EJB declarado de forma común el archivo application.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <beans>

    <bean  id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    </bean>

    <bean  id="ejb.PersonaServiceBean" class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean">
        <property name="jndiName">
            <value>ejb/PersonaServiceBean</value>
        </property>
        <property name="jndiTemplate">
            <ref local="jndiTemplate"/>
        </property>
        <property name="businessInterface">
            <value>com.dosideas.business.ejb.persona.PersonaServiceRemote</value>
        </property>
    </bean>
 </beans>

Nótese que el objeto "jndiTemplate" no tiene sobreescrito el atributo "environment". Si tuvieramos que cambiar los atributos java.naming.provider.url o java.naming.factory.initial no podríamos usar MockEjb en las pruebas. De ser necesario, podriamos crear un XML con el jndiTemplate para testing, y otro para un entorno productivo.

El test

En este Test, realizaremos las siguentes tareas:

  1. En el constructor, inicializamos MockEjb, configuramos la variable de entorno para Spring, y desplegamos el EJB en el container mock.
  2. En el método setearDependencias() buscamos el EJB utilizando Spring. Aquí podríamos hacer el lookup directamente del EJB, sin Spring, y accederiamos igualmente a MockEjb.
  3. Finalmente, en el método decirHola() invocamos al EJB.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
    "/application.xml" })
public class PersonaServiceBeanTest extends AbstractJUnit4SpringContextTests  {

    private static final String NOMBRE_JNDI = "ejb/PersonaServiceBean";

    //la clase bajo test
    private PersonaServiceRemote personaService;


    public PersonaServiceBeanSpringTest(String testName) throws NamingException {
        super(testName);

        //en el constructor debemos inicializar el contexto de MockEjb
        //sino Spring tratará de inicializarse y fallará
        MockContextFactory.setAsInitial();
        Context context = new InitialContext();
        context.bind("java:comp/env/ejb/BeanFactoryPath", "classpath:application.xml");

        MockContainer mockContainer = new MockContainer(context);
        //subimos nuestro Ejb a MockEjb
        SessionBeanDescriptor beanDescriptor = new SessionBeanDescriptor(NOMBRE_JNDI,
                PersonaServiceRemoteHome.class,
                PersonaServiceRemote.class,
                PersonaServiceBean.class);

        mockContainer.deploy(beanDescriptor);
    }


    @Before
    protected void setearDependencias() throws Exception {
        personaService = (PersonaServiceRemote) applicationContext.getBean("ejb.PersonaServiceBean");
    }


    /**
     * Realizamos el test del metodo decirHola().
     * Spring obtendra el Ejb, hacinedo un lookup contra MockEjb configurado en el constructor del test.
     */
    @Test
    public void decirHola() throws Exception {
        System.out.println("decirHola");
        String nombre = "Zim";
        String expResult = "Hola, " + nombre;

        String result = personaService.decirHola(nombre);

        assertEquals(expResult, result);
    }
 }

Ver también