2009-05-18 7 views
13

Ich migriere einen Spring MVC Controller, um die neueren Style-Annotationen zu verwenden, und Unit-Test eine Controller-Methode, die ein Befehlsobjekt validiert (siehe einfaches Beispiel unten).Mocking Spring MVC BindingResult bei der Verwendung von Anmerkungen

@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 
    } 

Mein Problem ist, ich habe die Controller-Methode in meinem Unit-Test zu nennen, und Mock Werte bieten ihre Unterschrift zu erfüllen den Code richtig zu trainieren, und ich kann nicht herausfinden, wie ein BindingResult zu verspotten.

Im alten Stil Controller die Unterschrift nahm einfach eine HttpServletRequest und HttpServletResponse, die leicht zu verspotten waren, aber aufgrund der Flexibilität der neuen Annotation Stil, muss man viel mehr in über die Signatur.

Wie kann man ein Spring BindingResult für die Verwendung in einem Komponententest verspotten?

Antwort

15

BindingResult ist eine Schnittstelle, also können Sie nicht einfach eine der Springs-Implementierungen dieser Schnittstelle übergeben?

Ich benutze keine Anmerkungen in meinem Spring MVC Code, aber wenn ich will die Validate-Methode von einem Prüfer testen ich in einer Instanz von BindException nur passieren und dann die Werte verwenden Sie es in assertEquals gibt usw.

+4

Hallo Markus, das brachte mich auf den richtigen Weg. Verwendung eines BindingResult bindingResult = new BeanPropertyBindingResult (command, "command"); und das Befehlsobjekt in dem Modell innerhalb meines Tests festzuhalten schien meinen Test zu sortieren. –

+1

So mache ich es auch. –

+0

Danke dafür, hat mir sehr geholfen! – Stefan

14

man könnte auch so etwas wie Mockito verwendet ein Modell des BindingResult zu erstellen und die zu Ihrer Controller-Methode übergeben, das heißt

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); 
} 

Dies können Sie mehr Flexibilität, und Gerüste vereinfachen.

+0

Was ist der 'lockAccessor' hier? –