如何编写Mock测试覆盖软删除无返回值方法的执行代码?
解决测试覆盖
userRepository.delete(userEntity)的问题 你当前的测试无法覆盖到userRepository.delete(userEntity),核心原因是创建的UserEntity没有设置lastAccessDate属性,代码执行到if (userEntity.getLastAccessDate() == null)分支时直接抛出ProhibitedAccessException,根本走不到删除逻辑那一步。
要覆盖这段代码,你需要调整测试逻辑,让代码能正常走到删除分支,再通过verify验证仓库方法的调用:
@Test void deleteUserSuccessTest() { final int id = 1; // 创建UserEntity并设置非null的lastAccessDate,避免触发禁止删除的异常 UserEntity userEntity = new UserEntity(); userEntity.setLastAccessDate(LocalDateTime.now()); // 替换为你实际使用的日期类型,比如Date var idString = String.valueOf(id); // 模拟仓库的findById方法返回该实体 when(userRepository.findById(id)).thenReturn(Optional.of(userEntity)); // 调用目标方法,此时不会抛出异常 userService.deleteUser(idString); // 验证仓库的delete方法被调用了一次,参数是我们创建的userEntity verify(userRepository, times(1)).delete(userEntity); }
另外,你原来的测试是验证异常场景,建议保留它作为单独的异常测试用例,再新增上面这个正常删除的测试用例,这样就能覆盖所有分支:
@Test void deleteUserThrowsProhibitedAccessExceptionTest() { final int id = 1; UserEntity userEntity = new UserEntity(); // 不设置lastAccessDate,保持为null var idString = String.valueOf(id); when(userRepository.findById(id)).thenReturn(Optional.of(userEntity)); // 精确断言具体的异常类型,而非泛型RuntimeException assertThrows(ProhibitedAccessException.class, () -> userService.deleteUser(idString)); }
注意点:
- 异常测试要精确匹配具体异常类型,这样测试逻辑更严谨。
- 确保
UserEntity有对应的setLastAccessDate方法,或者在构造时初始化该属性。
内容的提问来源于stack exchange,提问作者RobbLBobbl
相关产品推荐
相关产品推荐

