MockMvc测试@RestController时MockHttpServletResponse返回空如何处理?
问题根源
你控制器代码中@ResponseStatus注解指定了reason属性,只要配置了该参数,Spring MVC会直接调用HttpServletResponse.sendError()逻辑,这个逻辑会清空已写入的响应内容,同时忽略控制器方法的返回值,仅返回状态码和你配置的reason提示,因此你拿到的Mock响应内容为空,也不会设置JSON对应的内容类型。
解决方案
可以根据你的需求二选一修改:
- 方案1:删除
@ResponseStatus的reason参数,仅保留状态码配置,修改后的控制器代码如下:
@PostMapping("/create") @ResponseStatus(code=HttpStatus.CREATED) public Book makeBook(@RequestBody Book b ) { var res = bookRepository.save(b); System.out.println(res); return res; }
该方案无需修改测试代码,改完后控制器返回的Book对象会正常序列化为JSON写入响应体,内容类型也会自动配置为application/json,原有测试用例可直接通过。
- 方案2:如果你需要保留自定义提示信息,可替换为返回
ResponseEntity对象,修改后的控制器代码如下:
@PostMapping("/create") public ResponseEntity<Book> makeBook(@RequestBody Book b ) { var res = bookRepository.save(b); System.out.println(res); return ResponseEntity.status(HttpStatus.CREATED) .header("Custom-Reason", "Book created") .body(res); }
该方案可以同时保留自定义状态码、自定义响应头和完整响应体,完全符合REST接口规范。
内容的提问来源于stack exchange,提问作者Nice Books
相关产品推荐
相关产品推荐

