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
相关产品推荐
相关产品推荐

