Spring Boot Delete接口测试预期204却返回404问题求助
可能的原因及排查步骤
1. 检查Controller类级别的路径映射
你的测试请求URL是/fch-fiscal/usuarios/delete/{id},但仅在方法上标注了@DeleteMapping("/delete/{id}"),需确认Controller类上是否存在对应的类级路径映射:
@RestController @RequestMapping("/fch-fiscal/usuarios") // 必须存在该前缀,否则测试URL会不匹配 public class UsuarioController { // ... 你的remove方法 }
如果类上没有这个@RequestMapping,测试请求的URL会多出来前缀导致404;而Postman能成功,说明你在Postman中使用的是正确的短路径(比如/delete/35),和测试用的URL不一致。
2. 检查测试类的配置是否正确
确保测试类正确加载Web MVC上下文并配置MockMvc:
- 若仅测试Controller层,使用
@WebMvcTest指定目标Controller:
@WebMvcTest(UsuarioController.class) class UsuarioControllerTest { @Autowired private MockMvc mockMvc; // ... 你的测试方法 }
- 若为全栈集成测试,使用
@SpringBootTest配合@AutoConfigureMockMvc:
@SpringBootTest @AutoConfigureMockMvc class UsuarioControllerTest { @Autowired private MockMvc mockMvc; // ... 你的测试方法 }
若测试类未正确配置这些注解,MockMvc可能无法扫描到Controller映射,导致404。
3. 验证测试数据是否存在
Controller中如果service.findById(id)返回空,会返回404。Postman能成功说明其使用的环境中存在ID=35的用户,但测试环境(如内存数据库)中可能未初始化这条数据。
解决方法:在测试前初始化测试数据,比如用@BeforeEach构建测试数据:
@Autowired private UsuarioService service; @BeforeEach void setUp() { Usuario usuario = new Usuario(); usuario.setId(35L); // 设置其他必要字段 service.save(usuario); }
4. 启用日志查看请求映射详情
开启Spring MVC的DEBUG日志,查看所有已注册的请求映射,确认DELETE路径是否被正确识别:
在application-test.properties中添加:
logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=DEBUG
运行测试后,日志会输出所有映射路径,比如:
Mapped "{[/delete/{id}],methods=[DELETE]}" onto public org.springframework.http.ResponseEntity<java.lang.Object> mx.com.ficachi.master.login.controllers.UsuarioController.remove(java.lang.Long)
如果看不到你的DELETE路径,说明Controller未被扫描到,需检查测试类的组件扫描范围。
5. 检查URL拼写和大小写
确保测试中的URL路径和Controller映射完全一致,比如fch-fiscal、usuarios的大小写是否和类级映射匹配(Spring MVC默认大小写敏感,除非配置忽略)。
内容的提问来源于stack exchange,提问作者Axel Fernando Castro Jimenez

