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

Controller层JUnit测试预期返回200却得到201,求问题排查

问题排查与解决

嘿,我帮你梳理下几个关键问题,看完你就能解决测试不通过的问题啦:

1. 状态码预期与实际实现不匹配

这是导致测试失败的核心原因!
你的Controller代码里,addNew方法明确返回了201 Created状态码:

return new ResponseEntity<>(response, HttpStatus.CREATED);

但你的JUnit测试里却断言接口应该返回200 OK:

.andExpect(status().isOk());

解决方法二选一:

  • 如果业务上这个接口确实是创建资源,应该保持返回201,把测试断言改成status().isCreated()
  • 如果业务需要返回200,把Controller里的HttpStatus.CREATED改成HttpStatus.OK

2. 测试请求路径错误

你的Controller类上的@RequestMapping路径是/treat,但测试里发起请求的路径是/treats(多了一个末尾的s):

mockMvc.perform(post("/treats")...)

这个错误会导致请求找不到对应的接口,直接改成post("/treat")才能正确匹配到Controller的方法。

3. 测试代码中的变量定义错误

你在测试方法里定义了Treatment treatment = new Treatment();,但在Mock返回值的时候却用了未定义的treat变量:

given(treatmentService.save(Mockito.any(Treat.class))).willReturn(treat);

把这里的treat改成treatment,或者把变量名统一改成treat,不然测试会抛出变量未定义的异常。

关于JSON的补充说明

你提到“并未使用JSON”,但你的Controller方法用了@RequestBody注解,这个注解的作用就是解析JSON格式的请求体并绑定到Java对象上,所以测试里设置contentType(MediaType.APPLICATION_JSON_VALUE)是完全正确且必要的,去掉反而会导致接口无法正确解析请求体哦。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:55:33