Spring Boot无Controller时TestRestTemplate GET请求返回200而非404问题
Spring Boot测试请求始终返回200 OK的排查方案
问题重现
学习Spring Boot开发图书API时遇到异常现象:
- 未编写任何
RestController时,用TestRestTemplate请求/books/99,预期返回404 NOT FOUND,实际却返回200 OK; - 添加主动返回404的
BookController后,测试结果仍显示返回200 OK。
相关代码
初始测试代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class ApiApplicationTests { @Autowired TestRestTemplate restTemplate; @Test void returnsASingleBook() { ResponseEntity<String> response = restTemplate.getForEntity("/books/99", String.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); } }
修改后的测试代码(预期404)
@Test void returnsASingleBook() { ResponseEntity<String> response = restTemplate.getForEntity("/books/99", String.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); }
自定义BookController
@RestController public class BookController { @GetMapping("books/{requestedId}") public ResponseEntity<String> findById(@PathVariable Long requestedId){ return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } }
排查步骤
- 打印响应内容确认实际返回:在测试中添加
System.out.println("响应内容:" + response.getBody());,查看返回的是空白内容、白标签错误页还是其他自定义内容。如果是白标签错误页但状态码显示200,可能是配置修改了错误页的状态码。 - 检查路径匹配一致性:将控制器的
@GetMapping路径改为/books/{requestedId}(添加开头斜杠),再测试是否能匹配到请求路径。 - 验证控制器是否被扫描加载:检查
@SpringBootApplication主类的包路径是否包含BookController所在包。若路径不一致,需在主类添加@ComponentScan(basePackages = "你的控制器包路径")指定扫描范围。 - 换用MockMvc测试:MockMvc直接调用Spring的DispatcherServlet,能规避TestRestTemplate的客户端层面干扰,更精准反映请求处理逻辑:
@SpringBootTest @AutoConfigureMockMvc class ApiApplicationTests { @Autowired MockMvc mockMvc; @Test void returnsASingleBook() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/books/99")) .andExpect(MockMvcResultMatchers.status().isNotFound()); } }
- 排查过滤器/拦截器干扰:检查项目中是否存在自定义
Filter或ClientHttpRequestInterceptor,这类组件可能会篡改响应的状态码。 - 查看自动配置日志:启动测试时添加
--debug参数,查看是否有自动配置的组件(如错误页处理器)修改了响应行为。
内容的提问来源于stack exchange,提问作者jjbinks
相关产品推荐
相关产品推荐

