2009-05-18 47 views
13

Estoy migrando un controlador MVC de Spring para usar las anotaciones de estilo más nuevas, y quiero probar un controlador de un método que valida un objeto de comando (vea el ejemplo simple a continuación).Mocking Spring MVC BindingResult al usar las anotaciones

@RequestMapping(method = RequestMethod.POST) 
public String doThing(Command command, BindingResult result, 
        HttpServletRequest request, HttpServletResponse response, 
        Map<String, Object> model){ 
    ThingValidator validator = new ThingValidator(); 
    validator.validate(command, result); 
... other logic here 
    } 

Mi problema es que tengo que llamar al método del controlador en mi unidad de prueba, y proporcionar los valores simulados para satisfacer su firma para ejercer el código correctamente, y no puedo encontrar la manera de burlarse de un BindingResult.

En el controlador antiguo, la firma simplemente tomaba HttpServletRequest y HttpServletResponse, que eran fácilmente modificables, pero debido a la flexibilidad del nuevo estilo de anotación, uno tiene que pasar mucho más a través de la firma.

¿Cómo se puede simular un Spring BindingResult para su uso en una prueba unitaria?

Respuesta

15

BindingResult es una interfaz, así que ¿no puede pasar simplemente una de las implementaciones de Springs de esa interfaz?

No consumo anotaciones en mi código Spring MVC, pero cuando quiero probar el método de validación de un validador que sólo tiene que pasar en una instancia de BindException y luego utilizar los valores que devuelve en assertEquals etc.

+4

Hola Mark, que me puso en el camino correcto gracias. Usando un BindingResult bindingResult = new BeanPropertyBindingResult (comando, "comando"); y pegar el objeto de comando en el modelo dentro de mi prueba parecía ordenar mi prueba. –

+1

Así es como yo también lo hago. –

+0

¡Gracias por eso, me han ayudado mucho! – Stefan

14

también se podría usar algo como Mockito para crear una maqueta de la BindingResult y pasar eso a su método de control, es decir

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 
import static org.mockito.Mockito.verifyZeroInteractions; 

@Test 
public void createDoesNotCreateAnythingWhenTheBindingResultHasErrors() { 
    // Given 
    SomeDomainDTO dto = new SomeDomainDTO(); 
    ModelAndView mv = new ModelAndView(); 

    BindingResult result = mock(BindingResult.class); 
    when(result.hasErrors()).thenReturn(true); 

    // When 
    controller.create(dto, result, mv); 

    // Then 
    verifyZeroInteractions(lockAccessor); 
} 

Esto le puede dar más flexibilidad y simplificar los andamios.

+0

¿Qué es el 'lockAccessor' aquí? –

Cuestiones relacionadas