CRUD con Spring MVC Portlet (IV): Realizando pruebas unitarias
0. Índice de
contenidos.
1. Entorno
Este tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Mac Book Pro 17″ (2,6 Ghz Intel Core
i7, 8 GB
DDR3) - Sistema Operativo: Mac OS X Snow Leopard 10.6.4
- Spring MVC Portlet 3.0.4
- Maven 2.2.1
- Eclipse 3.6 (Helios) con M2Eclipse
- Spring Test 3.0.4
2. Introducción
Este tutorial es la cuarta parte de una serie, por lo que te recomiendo que antes leas:
En esta cuarta parte vamos a ver cómo podemos probar nuestro desarrollo sin necesidad de arrancar el gestor de portales, gracias a los mocks que nos proporciona Spring en su librería de test.
3. Manos a la obra
Lo primero que necesitamos es añadir la dependencia de spring test al pom de nuestro proyecto de esta forma:
org.springframework spring-test 3.0.4.RELEASE test junit junit 4.8.2 test
Ahora creamos la clase del test con el asistente de Eclipse para ello con botón derecho sobre la clase del controlador seleccionamos New –> Other –> JUnit –> JUnit Test Case asegurándonos de crear la clase de test dentro de la carpeta src/test/java (si no existe la creamos) para que Maven tenga el cuenta este test a lo ahora de ejecutar sus goals.
Una vez creada la clase de test, lo siguiente es configurarla para que arranque el contexto de Spring de nuestra aplicación.
package com.autentia.springcrudmvcportlet.controllers; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/context/applicationContext.xml" }) public class SpringCRUDMVCPortletViewControllerTest { }
Con estas anotaciones levantamos el contexto de Spring especificado en el atributo locations, que en nuestro caso, apunta al fichero applicationContext.xml de nuestro proyecto.
Ya estamos en disposición de realizar nuestro primer test unitario con Spring MVC Portlet. Como es el primero va a ser sencillo, simplemente vamos a chequear que el método defaultView mete en el model el atributo «listaPersonas».
@Resource private SpringCRUDMVCPortletViewController springCRUDMVCPortletViewController; @Test public void defaultView(){ ModelMap model = new ModelMap(); springCRUDMVCPortletViewController.defaultView(model); Assert.assertEquals(true, model.containsAttribute("listaPersonas")); }
Ahora sólo basta que ejecutemos el test para ver si la condición se cumple o se produce algún tipo de error.
Lo siguiente que vamos a hacer es probar el formulario y la validación del mismo. Para ello vamos a crear al menos dos casos de prueba, uno que sea correcto y otro que contenga un error, por ejemplo, que la persona introduzca como nombre Pepe (vuelvo a repetir que no tengo nada en contra de los que se llaman Pepe)
@Resource private PersonaFormValidator personaFormValidator; @Test public void validatorFormOK(){ PersonaForm personaForm = new PersonaForm(); personaForm.setNombre("Verónica"); personaForm.setApellidos("Gómez Gil"); personaForm.setDireccion("Calle de la Farmacia, 3"); BindingResult result = new BeanPropertyBindingResult(personaForm, "personaForm"); personaFormValidator.validate(personaForm, result); Assert.assertEquals(false, result.hasErrors()); } @Test public void validatorFormNoPepes(){ PersonaForm personaForm = new PersonaForm(); personaForm.setNombre("Pepe"); personaForm.setApellidos("Pérez"); personaForm.setDireccion("Calle de los Pepes, 3"); BindingResult result = new BeanPropertyBindingResult(personaForm, "personaForm"); personaFormValidator.validate(personaForm, result); Assert.assertEquals(true, result.hasErrors()); }
Ahora vamos a probar la inserción, la modificación y el borrado de una persona. Fijaos como Spring nos proporciona las clases MockActionResponse y MockActionRequest para cuando necesitamos simular el contexto de la request en los métodos de acción del portlet y MockRenderResponse y MockRenderRequest para los métodos de vista. Este podría ser un ejemplo:
@Test public void insertarPersonaOK(){ PersonaForm personaForm = new PersonaForm(); personaForm.setNombre("Verónica"); personaForm.setApellidos("Gómez Gil"); personaForm.setDireccion("Calle de la Farmacia, 3"); BindingResult result = new BeanPropertyBindingResult(personaForm, "personaForm"); String cancelar = null; ModelMap model = new ModelMap(); MockActionResponse response = new MockActionResponse(); String accion = "crud.alta"; springCRUDMVCPortletViewController.insertarPersona(personaForm, result, cancelar, model, response, accion); Assert.assertEquals(false, model.containsAttribute("futuraAccion")); } @Test public void modificarPersonaOK(){ PersonaForm personaForm = new PersonaForm(); personaForm.setNombre("Verónica"); personaForm.setApellidos("Gómez Gil"); personaForm.setDireccion("Calle de la Medicina, 3"); personaForm.setIdPersona(new Long(26)); BindingResult result = new BeanPropertyBindingResult(personaForm, "personaForm"); String cancelar = null; ModelMap model = new ModelMap(); MockActionResponse response = new MockActionResponse(); String accion = "crud.modificacion"; springCRUDMVCPortletViewController.modificarPersona(personaForm, result, cancelar, model, response, accion); Assert.assertEquals(false, model.containsAttribute("futuraAccion")); } @Test public void borrarPersonaOK(){ PersonaForm personaForm = new PersonaForm(); personaForm.setIdPersona(new Long(26)); String cancelar = null; ModelMap model = new ModelMap(); springCRUDMVCPortletViewController.bajaPersona(personaForm, cancelar, model); Assert.assertEquals(false, model.containsAttribute("futuraAccion")); }
4. Conclusiones
Como se demuestra es sencillo probar la lógica de nuestros portlets cuando están hechos con Spring MVC. La ventaja fundamental es que podemos realizar todas las pruebas que queramos sin necesidad de arrancar el gestro de portales, lo que provoca una reducción en el tiempo de desarrollo de los portlets y además se proporciona una forma de poder aplicar TDD para el desarrollo de portlets.
Con este tutorial doy por finalizada esta serie, y espero que os sea de utilidad.
Cualquier duda o sugerencia en la zona de comentarios.
Saludos.
hola!! disculpa me podrias enviar el war a mi correo porfavor!!?