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
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. –
'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