CRUD con Spring MVC Portlet (IV): Realizando pruebas unitarias

1
12045





CRUD con Spring MVC Portlet (IV)





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.


1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad