2017-12-18 7 views
0

Ich versuche, einen Controller mit mehreren HTTP-Verben mit Spring MockMvc zu testen. Derzeit GET und DELETE funktionieren wie erwartet, aber PUT und PATCH sind nicht zurück 201, wenn sie sein sollten.Spring MockMvc gibt 200 statt 201 zurück. Debuggen?

PATCH Der Regler ist wie folgt aufgebaut:

@CustomRequestMapping(method = PATCH, value = "/{api-root}") 
public ResponseEntity patch(@PathVariable(value = "api-root") String id, @RequestBody ApiRoot apiRoot) { 
    return apiRootService.softUpdate(id, apiRoot); 
} 

Die @CustomRequestMapping... Anmerkungsset nur bis consumes und produces ein bestimmte Inhaltstyp zu sein.

softUpdate() die oben beschriebene Methode verwiesen führt die folgenden:

public ResponseEntity softUpdate(String id, ApiRoot apiRoot) { 
    if (apiRoot.getId() == null) { 
     apiRoot.setId(id); 
    } 

    ApiRootDocument updated = softUpdate(apiRoot); 
    return ResponseEntity 
      .created(EscapeUtil.buildUrl(applicationProperties.getHostname(), applicationProperties.getPort(), id)) 
      .body(updated); 
} 

Dieser arbeitet und außerhalb des MockMvc Komponententests getestet. Es gibt korrekt einen 201 Created an Post-Manager zurück, wobei der Textkörper das neue JSON-Objekt ist, das als Ergebnis der PATCH erstellt wurde.

Mein Test ist Setup als:

public void testPatchApiRootEndpoint() throws Exception { 
    String testTitle = "New Test Title"; 

    // Mock the service call for softUpdate() to return 'created' in the same way that the method does 
    when(apiRootService.softUpdate(TestData.apiRoot1.getId(), TestData.apiRoot1.withTitle(testTitle))) 
      .thenReturn(ResponseEntity 
       .created(URI.create(EscapeUtil.buildUrlString("localhost", "8001", TestData.apiRoot1.getId()))) 
       .body((ApiRootDocument) TestData.apiRoot1.withTitle(testTitle))); 

    // Perform a patch update using a new title provided as key-value 
    JsonObject titleJson = new JsonObject(); 
    titleJson.addProperty("title", testTitle); 
    mockMvc.perform(patch("/{api-root}", TestData.apiRoot1.getId()) 
       .contentType(Constants.TAXII2_CONTENT_TYPE) 
       .content(titleJson.toString())) 
      .andExpect(status().isCreated()); 
} 

, die in einem 200 Ergebnisse zurückgegeben werden, anstelle eines 201. Ich bin wirklich verwirrt und es war schwierig zu recherchieren. Die meisten ähnlichen Probleme bestehen darin, 4XX-Antwortcodes zu finden, wenn sie 2XX erwarten, und die Lösung hat normalerweise etwas mit der Einrichtung der Anfrage zu tun.

Die einzige interessante Protokolle ich scheinen zu finden sind:

09:48:25.064 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Servlet '' configured successfully 
09:48:25.208 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - DispatcherServlet with name '' processing PATCH request for [/api-root-1] 
09:48:25.211 [main] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Looking up handler method for path /api-root-1 
09:48:25.219 [main] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Returning handler method [public org.springframework.http.ResponseEntity xor.bcmc.flarecloud.apiroot.controller.ApiRootController.patch(java.lang.String,xor.bcmc.taxii2.resources.ApiRoot)] 
09:48:25.388 [main] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Read [class xor.bcmc.taxii2.resources.ApiRoot] as "application/vnd.oasis.taxii+json;version=2.0" with [org.springfr[email protected]20921b9b] 
09:48:25.428 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Null ModelAndView returned to DispatcherServlet with name '': assuming HandlerAdapter completed request handling 
09:48:25.428 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Successfully completed request 

Antwort

1

wie Ihr verspottet Anruf Sieht nicht funktioniert. Sie können ganz einfach überprüfen, ob Sie Werte in die jeder() ersetzen:

when(apiRootService.softUpdate(Mockito.any(), Mockito.any()) 
.thenReturn(ResponseEntity 
       .created(URI.create(EscapeUtil.buildUrlString("localhost", "8001", TestData.apiRoot1.getId()))) 
       .body((ApiRootDocument) TestData.apiRoot1.withTitle(testTitle))); 

Ich habe gerade überprüft, wenn Sie von dem Controller falsch Mock verwenden ist 200 Status zurückgegeben, aber wenn Mock richtig bekam ich 201

+0

Danke, Das hat tatsächlich funktioniert, aber ich bin neugierig, warum Mockito und Spring die tatsächlich übergebenen Parameterwerte nicht erkennen können? Wie auch immer, es funktioniert und deckt den Code ab, den ich brauche, also nehme ich es. –

+0

'Mockito.any()' in meinem Beispiel ist es nur für die einfache Überprüfung, natürlich im wirklichen Leben sollten Sie tatsächliche Werte überprüfen, zum Beispiel 'Mockito.eq (TestData.apiRoot1.getId())' in Ihrem Fall – borino

Verwandte Themen