16 Stimmen

Mocking Spring MVC BindingResult bei Verwendung von Annotationen

Ich migriere einen Spring MVC-Controller, um die neueren Stil-Annotationen zu verwenden, und möchte eine Controller-Methode testen, die ein Befehlsobjekt validiert (siehe einfaches Beispiel unten).

 @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, dass ich die Methode des Controllers in meinem Unit-Test aufrufen und Mock-Werte bereitstellen müssen, um seine Signatur zu erfüllen, um den Code ordnungsgemäß auszuüben, und ich kann nicht herausfinden, wie man ein BindingResult mock.

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

Wie kann man ein Spring BindingResult für die Verwendung in einem Unit-Test mock?

20voto

Ted Pennings Punkte 1009

Sie könnten auch etwas verwenden wie Mockito eine Attrappe des BindingResult zu erstellen und diese an Ihre Controller-Methode zu übergeben, d.h.

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 kann Ihnen mehr Flexibilität verschaffen und den Gerüstbau vereinfachen.

18voto

Mark Punkte 28072

BindingResult ist eine Schnittstelle, so können Sie nicht einfach in einem von Springs Implementierungen dieser Schnittstelle übergeben?

Ich verwende keine Annotationen in meinem Spring MVC-Code, aber wenn ich die Validierungsmethode eines Validators testen möchte, übergebe ich einfach eine Instanz von BindException und verwende dann die Werte, die es in assertEquals usw. zurückgibt.

1voto

rvazquezglez Punkte 2076

Wie bereits in diese Antwort

A BindingResult wird von Spring MVC für jede eingehende HTTP-Anfrage erstellt.

Daher sollten Sie sich nicht über die BindingResult .

Anstatt die Methoden direkt aufzurufen, sollten Sie entweder einen echten http-Aufruf an den Controller durchführen oder eine Simulation mit MockMvc.perform . Hier ist eine Anleitung in der offiziellen Dokumentation, die zeigt, wie es geht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X