You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:24:03