首页 > 解决方案 > Mockito 模拟没有正确匹配参数(?)

问题描述

我正在尝试在服务层中存根一种方法来测试另一个对象:

@SpringBootTest
@RunWith(JUnitPlatform.class)
class WorkreportCrudFacadeTest {

  private static Logger LOGGER = LogManager.getLogger(WorkreportCrudFacadeTest.class);

  @Test
  public void detailTest() {

    final AccessRightsService ars = Mockito.mock(AccessRightsService.class);
    final SystemPriceSettingService spss = Mockito.mock(SystemPriceSettingService.class);
    final WorkreportActivityRepository wrar = Mockito.mock(WorkreportActivityRepository.class);
    final WorkreportRepository wrr = Mockito.mock(WorkreportRepository.class);
    final DomainObjectTools dot = Mockito.mock(DomainObjectTools.class);
    final ApplicationEventPublisher aep = Mockito.mock(ApplicationEventPublisher.class);

    Mockito.when(ars.hasEmployeeRightsToWorkReport(
        ArgumentMatchers.any(Employee.class), ArgumentMatchers.any(Workreport.class)
        )
    ).thenReturn(true);

    final WorkreportCrudFacade s = new WorkreportCrudFacade(ars, spss, wrar, wrr, dot, aep);

    final EmployeeId employeeId = new EmployeeId(154149756298300L);
    final WorkreportId workreportId = new WorkreportId(154149757395700L);

    final Workreport detail = s.detail(workreportId, employeeId);

    LOGGER.debug("Detail: {}", detail);

  }

}

和调用测试方法的方法:

  public Workreport detail(final WorkreportId workreportId, final EmployeeId employeeId) {

    final Workreport workreport = domainObjectTools.getWorkreportOrThrowNotFoundException(workreportId);
    final Employee viewer = domainObjectTools.getEmployeeOrThrowNotFoundException(employeeId);

    boolean hasRights = accessRightsService.hasEmployeeRightsToWorkReport(viewer, workreport);

    LOGGER.debug("Has rights: {}", hasRights);

    if (!hasRights) {
      throw new ForbiddenException();
    }

    return workreport;

  }

hasEmployeeAccessToWorkReport但是当我在实例上调用测试方法时WorkreportCrudFacade,该方法没有正确存根(它应该返回true,但返回false)。

我敢肯定这会是一些细节,但我无法找出问题所在 - 可能是参数匹配器中的问题,但不确定。

我正在使用 Mockito 2.22.0。

标签: springmockitostubbing

解决方案


引用ArgumentMatchers javadoc

由于 Mockito any(Class) 和 anyInt 系列匹配器执行类型检查,因此它们不会匹配空参数。而是使用 isNull 匹配器。

我认为这里发生了以下情况: YourDomainObjectTools是一个空的模拟(不是存根),因此它返回 nullWorkreport和 null Employee。它导致调用accessRightsService.hasEmployeeRightsToWorkReport(null,null). 值与null不匹配ArgumentMatchers.any(Class)


推荐阅读