MockEjb Con Spring
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)
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> <property name="expectedType" value="com.dosideas.business.ejb.persona.PersonaServiceRemoteHome"/> </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
public class PersonaServiceBeanSpringTest extends AbstractDependencyInjectionSpringContextTests { private static final String NOMBRE_JNDI = "ejb/PersonaServiceBean"; //la clase bajo test private PersonaServiceRemote personaService; @Override protected String[] getConfigLocations() { return new String[]{"classpath:application.xml"}; } 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(); 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); } @Override protected void onSetUp() 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. */ public void testDecirHola() throws Exception { System.out.println("decirHola"); String nombre = "Zim"; String expResult = "Hola, " + nombre; String result = personaService.decirHola(nombre); assertEquals(expResult, result); } }