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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:37:43