【问题标题】:junit Mock a method of AbstractService in a ChildServicejunit 在 ChildService 中模拟 AbstractService 的方法
【发布时间】:2021-01-05 14:34:59
【问题描述】:

我有一个扩展 AbstractService 的 TaskService。

在 abstractService 中,我有一个方法 getCurrentUserRoleEntity 被服务中的不同方法使用。此方法使用存储库来查找当前角色。

在我的任务服务中,我有一种方法可以找到当前用户角色和类别的任务, 该方法有 2 个参数,caegoryId 和 getCurrentUserRoleEntity 方法。

public List<Task> findTaskByCategoryIdForCurrentUserRole(Long categoryId) {
    return vTacheAffaireRepository.findTaskByCategoryIdForCurrentUserRoleOrderByEcheanceAscTacheIdAsc(categoryId, getCurrentUserRoleEntity().getId())
        .stream().map(vTaskMapper::toDto).collect(Collectors.toList());
}

当我测试调用服务的其余资源时,我想模拟 getCurrentUserRoleEntity 以使用我的测试实体而不是使用真实方法。

我尝试了不同的方法,但没有一个能满足我的需求。 你知道在休息测试期间如何模拟这个方法吗?

谢谢,

【问题讨论】:

  • 为什么不直接模拟超类使用的存储库?

标签: java mockito junit5


【解决方案1】:

非常简单的方法是,您可以为 getCurrentUserRoleEntity() 方法创建一个 setter 和 getter,您可以通过它插入您的模拟对象实例而不是真实的。

【讨论】:

  • 确实,我可以将方法中的抽象类中的方法封装到服务中,但这意味着我将创建一些仅用于单元测试的额外代码。其实我想做类似 Mockito.when(AbstractService::getCurrentUserRoleEntity).thenReturn(myMockuserRoleEntity);
  • 是的,确实这是一个好主意,您可以通过它避免样板代码。这个要点符合你的场景,gist.github.com/victortyau/e805ab2bbce1696fcc0579407d3a171e
  • TasckService taskServiceMock = Mockito.mock(TaskService.class, CALLS_REAL_METHODS); when(taskService.getCurrentUserRoleEntity()).thenReturn(userRoleEntity);这个问题,我有一个空指针。当我查看调试时,空指针来自抽象类中的方法,调试显示“userRoleRepository = 'this' is not available”。为什么它通过方法而不是返回值?
  • 能否提供那个抽象类的代码sn-p?
  • 公共抽象类 AbstractService {@Autowired UserRoleRepository userRoleRepository; public UserRoleEntity getCurrentUserRoleEntity() { return userRoleRepository.findByUserAndRole( userRepository.findByName(getCurrentUserLogin()), roleRepository.findByName(getCurrentUserRoleName().orElseThrow(()) -> new Exception("找不到用户角色", "user-role.not -成立”))) ); } }
【解决方案2】:

尝试在测试中覆盖该方法,鉴于您的方法是公开的,您可以定义一个名为 TestTaskService 的新类

TestTaskService extends TaskService {
@Override
public List<Task> findTaskByCategoryIdForCurrentUserRole(Long categoryId) {
//provide mock implementation 
}

} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    相关资源
    最近更新 更多