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

JUnit用户更新方法测试失败:无法通过ID查找用户

问题分析与解决方案

问题根源

你的JUnit测试执行updateUser时提示找不到用户,核心原因是测试方法中没有对userRepository.findById()方法进行Mock配置。updateUser方法逻辑是先通过ID查询用户,再执行更新,但当前测试只Mock了saveAndFlush,未MockfindById的返回结果,导致实际调用时findById返回空Optional,调用.get()触发NoSuchElementException,最终抛出InvalidIdException。

另外还有两个辅助问题:

  • startUser()方法中创建的User实例未设置ID,而测试时传入的更新ID是1L,Mock匹配逻辑不严谨;
  • 现有测试未验证更新后的字段值是否符合预期,测试覆盖率不足。

修正后的测试代码

1. 完善startUser()方法,为User设置匹配ID

private void startUser() {
    user = new User("Valdir", "valdir@gmail.com", "123456", new Date());
    user.setId(1L); // 设置与测试传入ID一致的值
    optionalUser = Optional.of(new User("Valdir", "valdir@gmail.com", "123456", new Date()));
    optionalUser.get().setId(1L);
}

2. 修正whenUpdateThenReturnSuccess测试方法

添加findById的Mock配置,并验证更新后的字段值:

@Test
void whenUpdateThenReturnSuccess() {
    // Mock findById返回存在的用户
    when(userRepository.findById(anyLong())).thenReturn(optionalUser);
    // 准备更新后的用户数据
    User updatedUser = new User("Valdir Updated", "valdir@gmail.com", "654321", new Date());
    updatedUser.setId(1L);
    // Mock saveAndFlush返回更新后的用户
    when(userRepository.saveAndFlush(any(User.class))).thenReturn(updatedUser);

    // 执行更新操作
    User response = userServiceImpl.updateUser(1L, updatedUser);

    // 验证结果
    assertNotNull(response);
    assertEquals(User.class, response.getClass());
    assertEquals("Valdir Updated", response.getName()); // 验证更新后的名称
    assertEquals("654321", response.getPassword()); // 验证更新后的密码
}

3. 可选:添加更新失败的测试用例(验证异常抛出)

@Test
void whenUpdateThenThrowInvalidIdException() {
    // Mock findById返回空Optional
    when(userRepository.findById(anyLong())).thenReturn(Optional.empty());

    // 验证抛出指定异常
    InvalidIdException exception = assertThrows(InvalidIdException.class, () -> {
        userServiceImpl.updateUser(999L, user);
    });

    assertEquals("Usuário não encontrado!", exception.getMessage());
}

额外优化建议

  • 移除测试类上的@SpringBootTest:使用Mockito进行Mock测试时,不需要加载完整Spring上下文,改用@ExtendWith(MockitoExtension.class)更轻量;
  • 修正whenRegisterThenReturnAnEmailExistException测试:当前捕获ClassCastException错误,应直接捕获EmailExistException,且测试逻辑冗余,修正后代码:
@Test
void whenRegisterThenReturnAnEmailExistException() {
    when(userRepository.findByEmail(anyString())).thenReturn(user);

    EmailExistException exception = assertThrows(EmailExistException.class, () -> {
        userServiceImpl.registerUser(user);
    });

    assertEquals("Esse e-mail já está cadastrado!", exception.getMessage());
}

内容的提问来源于stack exchange,提问作者Murillo N.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:50:41