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

Spring Boot Controller测试预期返回404却返回200如何解决

问题原因

当前Controller接口直接返回Optional<Customer>类型,Spring MVC默认处理规则为:只要请求流程没有抛出异常,无论返回的Optional是空还是有值,都会默认返回200状态码,空的Optional只会被序列化为空的响应体,不会自动映射为404状态码,所以才会出现测试预期404实际返回200的问题。

解决方案

最常用的方案是调整Controller层的返回逻辑,手动判断Optional的状态返回对应状态码:

修改后的Controller代码

@RestController
public class CustomerController {

    @Autowired
    private CustomerService customerService;

    @GetMapping(path = "/customers/{id}")
    public ResponseEntity<Customer> findCustomerById(@PathVariable("id") Long id){
        return customerService.findById(id)
                // 存在客户则返回200状态码+客户数据
                .map(ResponseEntity::ok)
                // 不存在客户则返回404状态码
                .orElse(ResponseEntity.notFound().build());
    }
}

修改后原有测试用例无需调整,运行即可正常通过。
如果需要全局生效所有返回Optional的接口,空值自动返回404,可以通过自定义ResponseBodyAdvice全局处理返回值,无需逐个修改Controller接口。

内容的提问来源于stack exchange,提问作者wick3d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 02:51:03