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
相关产品推荐
相关产品推荐

