Diferencia entre revisiones de «MockEjb Con Spring»

De Dos Ideas.
Saltar a: navegación, buscar
(Archivo de configuración de Spring)
 
(No se muestran 9 ediciones intermedias de 3 usuarios)
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===
 
Supongamos el siguiente EJB declarado de forma común el archivo ''application.xml''
 
Supongamos el siguiente EJB declarado de forma común el archivo ''application.xml''
<pre>
+
<code xml>
 
  <?xml version="1.0" encoding="UTF-8"?>
 
  <?xml version="1.0" encoding="UTF-8"?>
 
  <beans>
 
  <beans>
Línea 31: Línea 33:
 
     </bean>
 
     </bean>
 
  </beans>
 
  </beans>
</pre>
+
</code>
  
 
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.
 
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 ===
+
=== El test (localización con Spring) ===
 +
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.
 +
# Como la instancia bajo test se encuentra anotada con ''@Autowired'', Spring la inyectará automáticamente. Para inyectarla, Spring realizará una búsqueda del EJB, el cual lo encontrará en nuestro container mock que se acaba de levantar.
 +
# Finalmente, en el método ''decirHola()'' invocamos al EJB.
  
<pre>
+
<code java>
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";
  
 
     //la clase bajo test
 
     //la clase bajo test
 +
    @Autowired
 
     private PersonaServiceRemote personaService;
 
     private PersonaServiceRemote personaService;
  
    @Override
+
 
     protected String[] getConfigLocations() {
+
     public PersonaServiceBeanTest() throws NamingException {
         return new String[]{"classpath:application.xml"};
+
         //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);
 
     }
 
     }
  
     public PersonaServiceBeanSpringTest(String testName) throws NamingException {
+
    /**
         super(testName);
+
    * 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);
 +
    }
 +
}
 +
</code>
  
 +
=== El test (localización manual) ===
 +
 +
Este test hereda de ''AbstractJUnit4SpringContextTests'' y utiliza Spring para ubicar el EJB bajo test. Es muy facil realizar el mismo test sin soporte de Spring para la localización. En este caso, deberemos crear un método anotado con ''@Before'' que se encargue de realizar el lookup del EJB en cuestión. El resto del test es igual.
 +
 +
<code java>
 +
public class PersonaServiceBeanTest{
 +
 +
    private static final String NOMBRE_JNDI = "ejb/PersonaServiceBean";
 +
 +
    //la clase bajo test
 +
    private PersonaServiceRemote personaService;
 +
 +
 +
    public PersonaServiceBeanTest() throws NamingException {
 
         //en el constructor debemos inicializar el contexto de MockEjb
 
         //en el constructor debemos inicializar el contexto de MockEjb
 
         //sino Spring tratará de inicializarse y fallará
 
         //sino Spring tratará de inicializarse y fallará
 
         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 121:
 
     }
 
     }
  
     @Override
+
 
     protected void onSetUp() throws Exception {
+
     @Before
         personaService = (PersonaServiceRemote) applicationContext.getBean("ejb.PersonaServiceBean");
+
     public void setearDependencias() throws NamingException, CreateException, RemoteException {
 +
         InitialContext context = new InitialContext();
 +
       
 +
        Object personaRef = context.lookup(NOMBRE_JNDI);
 +
        PersonaServiceRemoteHome home = (PersonaServiceRemoteHome)
 +
                      PortableRemoteObject.narrow(personaRef, PersonaServiceRemoteHome.class);
 +
        personaService = home.create();
 
     }
 
     }
 +
  
 
     /**
 
     /**
 
     * Realizamos el test del metodo decirHola().
 
     * Realizamos el test del metodo decirHola().
    * 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";
Línea 87: Línea 147:
 
     }
 
     }
 
  }
 
  }
</pre>
+
</code>
  
 
==Ver también==
 
==Ver también==
 +
* [[MockEjb]]
 
* [[Spring Test]]
 
* [[Spring Test]]
 
* [[Ejb Con Spring]]
 
* [[Ejb Con Spring]]
 +
 +
[[Category:TDD]]
 +
[[Category:Spring Framework]]
 +
[[Category:EJB]]

Revisión actual del 14:36 31 ago 2009

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 (localización con Spring)

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. Como la instancia bajo test se encuentra anotada con @Autowired, Spring la inyectará automáticamente. Para inyectarla, Spring realizará una búsqueda del EJB, el cual lo encontrará en nuestro container mock que se acaba de levantar.
  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
   @Autowired
   private PersonaServiceRemote personaService;


   public PersonaServiceBeanTest() throws NamingException {
       //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);
   }
   /**
    * 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);
   }
}

El test (localización manual)

Este test hereda de AbstractJUnit4SpringContextTests y utiliza Spring para ubicar el EJB bajo test. Es muy facil realizar el mismo test sin soporte de Spring para la localización. En este caso, deberemos crear un método anotado con @Before que se encargue de realizar el lookup del EJB en cuestión. El resto del test es igual.

public class PersonaServiceBeanTest{

   private static final String NOMBRE_JNDI = "ejb/PersonaServiceBean";
   //la clase bajo test
   private PersonaServiceRemote personaService;


   public PersonaServiceBeanTest() throws NamingException {
       //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
   public void setearDependencias() throws NamingException, CreateException, RemoteException {
       InitialContext context = new InitialContext();
       
       Object personaRef = context.lookup(NOMBRE_JNDI);
       PersonaServiceRemoteHome home = (PersonaServiceRemoteHome)
                      PortableRemoteObject.narrow(personaRef, PersonaServiceRemoteHome.class);
       personaService = home.create();
   }


   /**
    * Realizamos el test del metodo decirHola().
    */
   @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