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

SpringBoot单元测试接口返回404而非200问题求助

问题原因及修复

核心问题

  1. Controller校验逻辑未被Mock覆盖:CurriculoController的updateDadosPessoais方法会先调用service.findById(id)检查资源是否存在,但测试中仅Mock了updateDadosPessoais方法,未MockfindById,导致该方法返回null,触发404响应。
  2. 测试ID不统一:MockupdateDadosPessoais时使用的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:45:30