Diferencia entre revisiones de «Spring Test MVC»

De Dos Ideas.
Saltar a: navegación, buscar
(Página creada con 'El objetivo de Spring Test Mvc es facilitar y mejorar los test de los controladores de Spring MVC. Estos controladores utilizan muchos componentes, como el mapeo de resp…')
 
(Método del controller)
 
(No se muestran 9 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
El objetivo de [[Spring Test Mvc]] es facilitar y mejorar los test de los controladores de [[Spring MVC]]. Estos controladores utilizan muchos componentes, como el mapeo de respuestas (ResponseBody), conversiones (json, xml), mapeo de excepciones (ExceptionHandler), etc. Estos componentes no pueden ser testeados mediante los test unitarios y hasta ahora solo se podían testear mediante tests de integración, esto implica embeber un contenedor para los servlets, desplegar la aplicación y testear con el cliente de [[Spring]] RestTemplate o directamente con herramientas como selenium y también un alto costo de mantenimiento.
+
El objetivo de [[Spring Test MVC]] es facilitar y mejorar los test de los controladores de Spring MVC. Estos controladores utilizan muchos componentes, como el mapeo de respuestas (ResponseBody), conversiones (json, xml), mapeo de excepciones (ExceptionHandler), etc. Estos componentes no pueden ser testeados mediante los test unitarios y hasta ahora solo se podían testear mediante tests de integración, esto implica embeber un contenedor para los servlets, desplegar la aplicación y testear con el cliente REST de Spring o directamente con herramientas como selenium. Estos test traen aparejado un alto costo de mantenimiento.
  
 +
[[Spring Test MVC]] mockea el contexto web de spring y permite invocar los servicio expuesto en los controladores ejecutando los interceptores de conversión y mapeo de Spring MVC.
  
Ejemplo
+
==Ejemplo==
  
Método del controller.
+
===Método del controller===
  
 
<code java>
 
<code java>
 
@RequestMapping(value="/persona",method= RequestMethod.POST)
 
@RequestMapping(value="/persona",method= RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
+
@ResponseStatus(HttpStatus.CREATED)
    public @ResponseBody Persona guardar(@RequestBody Persona persona) {
+
public @ResponseBody Persona guardar(@RequestBody Persona persona) {
        persona.setId(new Random(Long.MAX_VALUE).nextInt());
+
  persona.setId(new Random(Long.MAX_VALUE).nextInt());
        persona.setNombre(persona.getNombre());
+
  return persona;
        return persona;
+
}  
    }  
+
</code>
</code>  
 
  
Test del método.
+
===Test del método===
  
 
<code java>
 
<code java>
 
@Test
 
@Test
 
public void guardar_retorna_persona_con_id() throws Exception {
 
public void guardar_retorna_persona_con_id() throws Exception {
        String personaJson = "{\"nombre\":\"coco\"}";
+
  String personaJson = "{\"nombre\":\"coco\"}";
        MockMvcBuilders.standaloneSetup(new PersonaController()).build()
+
  MockMvcBuilders.standaloneSetup(new PersonaController()).build()
                /* Operación y servicio */
+
  /* Operación y servicio */
                .perform(post("/persona")
+
  .perform(post("/persona")
                /* Content type para indicar formato de la información del body */
+
  /* Content type para indicar formato de la información del body */
                .contentType(MediaType.APPLICATION_JSON)
+
  .contentType(MediaType.APPLICATION_JSON)
                /* Accep para que la respuesta sea JSON */
+
  /* Accep para que la respuesta sea JSON */
                .accept(MediaType.APPLICATION_JSON)
+
  .accept(MediaType.APPLICATION_JSON)
                /* Set del body */
+
  /* Set del body */
                .body(personaJson.getBytes()))
+
  .body(personaJson.getBytes()))
                /* Imprime por consola */
+
  /* Imprime por consola */
                .andDo(print())
+
  .andDo(print())
                /* Control del status http */
+
  /* Control del status http */
                .andExpect(status().isCreated())
+
  .andExpect(status().isCreated())
                /* Control de que exista el atributo nombre */
+
  /* Control de que exista el atributo nombre */
                .andExpect(jsonPath("nombre").exists())
+
  .andExpect(jsonPath("nombre").exists())
                /* Control de que exista el atributo id */
+
  /* Control de que exista el atributo id */
                .andExpect(jsonPath("id").exists())
+
  .andExpect(jsonPath("id").exists())
                /* Control del valor del atributo nombre */
+
  /* Control del valor del atributo nombre */
                .andExpect(jsonPath("nombre").value("coco"));
+
  .andExpect(jsonPath("nombre").value("coco"));
 
                  
 
                  
 
}
 
}
<code>
+
</code>
 +
 
 +
El proyecto demo se puede descargar de nuestro proyecto en [http://code.google.com/p/dosideas-aplicaciones-modelo/source/browse/ google-code].
 +
 
 +
== Ver también ==
 +
[https://github.com/SpringSource/spring-test-mvc Spring Test MVC ]
 +
 
 +
[[Category:Spring MVC]]

Revisión actual del 14:51 12 mar 2012

El objetivo de Spring Test MVC es facilitar y mejorar los test de los controladores de Spring MVC. Estos controladores utilizan muchos componentes, como el mapeo de respuestas (ResponseBody), conversiones (json, xml), mapeo de excepciones (ExceptionHandler), etc. Estos componentes no pueden ser testeados mediante los test unitarios y hasta ahora solo se podían testear mediante tests de integración, esto implica embeber un contenedor para los servlets, desplegar la aplicación y testear con el cliente REST de Spring o directamente con herramientas como selenium. Estos test traen aparejado un alto costo de mantenimiento.

Spring Test MVC mockea el contexto web de spring y permite invocar los servicio expuesto en los controladores ejecutando los interceptores de conversión y mapeo de Spring MVC.

Ejemplo

Método del controller

@RequestMapping(value="/persona",method= RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public @ResponseBody Persona guardar(@RequestBody Persona persona) {

  persona.setId(new Random(Long.MAX_VALUE).nextInt());
  return persona;

}

Test del método

@Test public void guardar_retorna_persona_con_id() throws Exception {

 String personaJson = "{\"nombre\":\"coco\"}";
 MockMvcBuilders.standaloneSetup(new PersonaController()).build()
 /* Operación y servicio */
 .perform(post("/persona")
 /* Content type para indicar formato de la información del body */
 .contentType(MediaType.APPLICATION_JSON)
 /* Accep para que la respuesta sea JSON */
 .accept(MediaType.APPLICATION_JSON)
 /* Set del body */
 .body(personaJson.getBytes()))
 /* Imprime por consola */
 .andDo(print())
 /* Control del status http */
 .andExpect(status().isCreated())
 /* Control de que exista el atributo nombre */
 .andExpect(jsonPath("nombre").exists())
 /* Control de que exista el atributo id */
 .andExpect(jsonPath("id").exists())
 /* Control del valor del atributo nombre */
 .andExpect(jsonPath("nombre").value("coco"));
               

}

El proyecto demo se puede descargar de nuestro proyecto en google-code.

Ver también

Spring Test MVC