[英]Spring MockMvc is returning 200 instead of a 201. How to debug?
I am attempting to test a controller with several HTTP verbs using Spring MockMvc.我正在尝试使用 Spring MockMvc 测试具有多个 HTTP 动词的控制器。 Currently
GET
and DELETE
work as expected, but PUT
and PATCH
are not returning 201, when they should be.目前
GET
和DELETE
按预期工作,但PUT
和PATCH
没有返回 201,而它们应该返回。
The PATCH
controller is setup as follows: PATCH
控制器设置如下:
@CustomRequestMapping(method = PATCH, value = "/{api-root}")
public ResponseEntity patch(@PathVariable(value = "api-root") String id, @RequestBody ApiRoot apiRoot) {
return apiRootService.softUpdate(id, apiRoot);
}
The @CustomRequestMapping...
annotation just sets up consumes
and produces
to be a particular content type. @CustomRequestMapping...
注释只是将consumes
和produces
设置为特定的内容类型。
the softUpdate()
method referenced above performs the following: softUpdate()
方法执行以下操作:
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);
}
This is working and tested outside of the MockMvc unit tests.这是在 MockMvc 单元测试之外工作和测试的。 It correctly returns a
201 Created
to Postman, with the body being the new JSON Object that was created as a result of the PATCH
.它正确地将
201 Created
返回给 Postman,主体是作为PATCH
结果创建的新 JSON 对象。
My test is setup as:我的测试设置为:
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());
}
Which results in a 200
being returned, instead of a 201
.这导致
200
被返回,而不是201
。 I'm really confused, and it has been difficult to research.我真的很困惑,一直很难研究。 Most similar issues are finding 4XX response codes when they expect 2XX, and the solution is typically something to do with the setup of the request.
大多数类似的问题是在他们期望 2XX 时找到 4XX 响应代码,解决方案通常与请求的设置有关。
The only interesting logs I can seem to find are:我似乎能找到的唯一有趣的日志是:
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.springframework.http.converter.json.MappingJackson2HttpMessageConverter@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
Looks like your mocked call not worked.看起来您的模拟电话无效。 You can easily check if you replace values to the any():
您可以轻松检查是否将值替换为 any():
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)));
I just checked if you use wrong mock from controller is returned 200 status, but if mock is correct i got 201.我刚刚检查了您是否使用了错误的控制器模拟返回 200 状态,但如果模拟正确,我得到 201。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.