Spring测试类中接口请求返回404错误排查(已携带Bearer Token且Postman请求正常)
解决MockMvc测试返回404但Postman正常的问题
从你的测试代码和控制台输出来看,核心问题是请求路径没有正确映射到控制器(控制台里Handler: Type = null已经明确这一点),结合Postman能正常访问的情况,我给你梳理几个关键排查和解决方向:
1. 去掉MockMvc请求中的完整URL前缀
MockMvc是在Spring的模拟Servlet环境中发起请求,不需要指定http://localhost:8080这类完整主机地址,只需要使用相对路径即可。你当前的请求带了完整域名,会导致MockMvc无法正确匹配控制器的映射规则。
修改测试代码中的请求路径:
// 去掉http://localhost:8080,保留上下文路径+接口路径 .perform(get("/CashLetterAPI/rest/moneda/findById/{id}", 1) .header("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJzb2Z0dGVrSldUIiwic3ViIjoiZXhhbXBsZSIsImlhdCI6MTYxOTcwNTE0MiwiZXhwIjoxNjE5NzExMTQyfQ.e82DP4xfm-sPPHmxEv5tzGSwnAVCnQeP61DSSWtZZlM45wT7tFNQSMakjy_FptYBwrN28CFlpt1dDuT6u_mjVA"))
如果你的测试环境没有配置server.servlet.context-path(或者配置与开发环境不同),可以直接去掉/CashLetterAPI前缀:
.perform(get("/rest/moneda/findById/{id}", 1) .header("Authorization", "Bearer ..."))
2. 验证控制器的映射路径是否完全匹配
检查你的MonedaRestController类和方法的注解:
- 控制器类上的
@RequestMapping是否为/rest/moneda? findById方法上的@GetMapping是否为/findById/{id}?
要确保测试中的路径和Postman里的请求路径完全一致(包括大小写、下划线等细节),毕竟MockMvc的路径匹配是严格的。
3. 确认测试环境的Token配置一致性
虽然Postman里Token有效,但测试环境的JWT配置可能和开发环境不一致:
- 查看
config.properties中的JWT密钥、过期时间等配置是否和生成Token的环境一致。 - 注意:如果授权过滤器逻辑错误(比如验证失败返回404而非401)也可能导致问题,但从当前控制台输出看,请求根本没找到控制器,所以这个可能性较低。
4. 检查测试数据加载情况
你用了@Sql("/data.sql"),要确保脚本里确实插入了id=1的Moneda数据。不过如果是数据不存在,接口返回404时控制台会显示Handler存在,而非Type = null,所以这不是当前核心问题。
修改后的完整测试代码示例:
@Test void testGetMonedaPorId() throws UnsupportedEncodingException, Exception { String response = mockMvc .perform(get("/CashLetterAPI/rest/moneda/findById/{id}", 1) .header("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJzb2Z0dGVrSldUIiwic3ViIjoiZXhhbXBsZSIsImlhdCI6MTYxOTcwNTE0MiwiZXhwIjoxNjE5NzExMTQyfQ.e82DP4xfm-sPPHmxEv5tzGSwnAVCnQeP61DSSWtZZlM45wT7tFNQSMakjy_FptYBwrN28CFlpt1dDuT6u_mjVA")) .andExpect(status().isOk()) .andReturn().getResponse().getContentAsString(); logger.info("response: " + response); // assertEquals(1L, monedaService.getMonedaPorId(1L).getId()); }
优先尝试修改路径,这是最可能解决问题的方案。如果还是不行,可以开启Spring的调试日志(比如设置logging.level.org.springframework.web=DEBUG),查看请求的映射过程,进一步定位问题。
内容的提问来源于stack exchange,提问作者melolo
相关产品推荐
相关产品推荐

