SpringBoot单元测试接口返回404而非200问题求助
问题原因及修复
核心问题
- Controller校验逻辑未被Mock覆盖:
CurriculoController的updateDadosPessoais方法会先调用service.findById(id)检查资源是否存在,但测试中仅Mock了updateDadosPessoais方法,未MockfindById,导致该方法返回null,触发404响应。 - 测试ID不统一:Mock
updateDadosPessoais时使用的是novoCurriculo.getId(),但接口调用时使用createCurriculoInput().getId()——每次调用createCurriculoInput()都会生成新UUID,两者完全不匹配。
修复方案
修改测试方法,统一ID并MockfindById方法:
修改后的测试方法
@Test @DisplayName("Deve retornar sucesso ao atualizar os dados pessoais do currículo") public void deveRetornarSucessoAoAtualizarDadosPessoaisDoCurriculo() throws Exception { // 统一使用测试数据的ID UUID testId = novoCurriculo.getId(); var ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); var json = ow.writeValueAsString(curriculoExpected.getDadosPessoais()); // Mock findById,模拟资源存在 doReturn(novoCurriculo).when(curriculoService).findById(testId); // Mock updateDadosPessoais,使用统一ID doReturn(curriculoExpected).when(curriculoService) .updateDadosPessoais(curriculoExpected.getDadosPessoais(), testId); // 接口调用使用统一ID mockMvc.perform(patch(BASE_PATH + "/dados-pessoais/" + testId) .contentType(JSON_FORMAT) .content(json)) .andExpect(status().isOk()); }
额外优化建议
- 避免在测试中多次调用
createCurriculoInput()生成新对象,提前初始化固定的测试数据 - 可将
testId提取为测试类的成员变量,进一步简化代码
内容的提问来源于stack exchange,提问作者Bruno Machado
相关产品推荐
相关产品推荐

