Mockito mock неправильно соответствует аргументам (?) - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь заглушить один метод в сервисном слое для тестирования другого объекта:

@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.

1 Ответ

0 голосов
/ 06 ноября 2018

Цитировать из ArgumentMatchers Javadoc :

Так как Mockito любые (Class) и сопоставители семейства anyInt выполняют проверку типа, таким образом, они не будут соответствовать нулевым аргументам. Вместо этого используйте средство сравнения isNull.

Я думаю, что здесь происходит следующее: Ваш DomainObjectTools - пустой макет (не заглушенный), и поэтому он возвращает ноль Workreport и ноль Employee. В результате вызывается accessRightsService.hasEmployeeRightsToWorkReport(null,null). null значения не соответствуют ArgumentMatchers.any(Class).

...