![](/img/trans.png)
[英]Spring Boot MockMVC returning empty body with statuscode 200 when unit testing
[英]Spring MockMvc is returning 200 instead of a 201. How to debug?
我正在尝试使用 Spring MockMvc 测试具有多个 HTTP 动词的控制器。 目前GET
和DELETE
按预期工作,但PUT
和PATCH
没有返回 201,而它们应该返回。
PATCH
控制器设置如下:
@CustomRequestMapping(method = PATCH, value = "/{api-root}")
public ResponseEntity patch(@PathVariable(value = "api-root") String id, @RequestBody ApiRoot apiRoot) {
return apiRootService.softUpdate(id, apiRoot);
}
@CustomRequestMapping...
注释只是将consumes
和produces
设置为特定的内容类型。
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);
}
这是在 MockMvc 单元测试之外工作和测试的。 它正确地将201 Created
返回给 Postman,主体是作为PATCH
结果创建的新 JSON 对象。
我的测试设置为:
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());
}
这导致200
被返回,而不是201
。 我真的很困惑,一直很难研究。 大多数类似的问题是在他们期望 2XX 时找到 4XX 响应代码,解决方案通常与请求的设置有关。
我似乎能找到的唯一有趣的日志是:
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
看起来您的模拟电话无效。 您可以轻松检查是否将值替换为 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)));
我刚刚检查了您是否使用了错误的控制器模拟返回 200 状态,但如果模拟正确,我得到 201。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.