Можно ли издеваться и игнорировать свойства - PullRequest
0 голосов
/ 10 декабря 2018

Я меняю нашу стратегию идентификации, и мы используем идентификатор, который генерируется до записи объекта в базу данных.Это изменение приводит к сбою некоторых наших тестов из-за способа насмешки над некоторыми вызовами службы.

TimeLog timeLog = buildTimeLog('123456', mockEmployeeId);
TimeLog mockTimeLog = buildTimeLog('123456', mockEmployeeId);
when(this.timeLogService.save(mockTimeLog)).thenReturn(timeLog);

Когда тест выполняет вызов к контроллеру, связанная сущность в контроллере получает другойID, чем макет, который ожидается, потому что сущность генерирует идентификатор.В то время как раньше база данных генерировала идентификатор, чтобы макеты работали.

Есть ли способ сказать Мокито, чтобы он игнорировал свойство в ожидании?Это решит проблему, и тест все еще будет в силе.В противном случае приветствуются другие подходы.

1 Ответ

0 голосов
/ 11 декабря 2018

Вы не можете сказать mockito игнорировать свойство в ожидании, потому что оно использует java-метод "equals" ... Вы можете определить метод equals в TimeLog с идентификатором igonres, но я подозреваю, что он не даст вам то, что выхочу.Другой подход состоит в том, чтобы вместо попытки сказать mockito, что не нужно проверять, определите явно, что это такое, чтобы проверить с помощью устройства для определения подколенного сухожилия.Определите совпадение подколенного сухожилия, которое просто совпадает с полями, которые вы хотите проверить, т.е. со всеми полями, кроме ID.Так что-то вроде:

private class TimeLogMatcher extends TypeSafeMatcher<TimeLog> {
    private final EmployeeId employeeId;

    public TimeLogMatcher(EmployeeId employeeId) {
        this.employeeId = employeeId;
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("TimeLog with employeeId=" + employeeId);
    }

    @Override
    public boolean matchesSafely(TimeLog item) {
        return employeeId.equals(item.getEmployeeId());
    }
}

И затем вместо вызова того, что ваш метод "buildTimeLog" выполняет, вызов в класс mockito Matchers, например:

TimeLog timeLog = Matchers.argThat(new TimeLogMatcher(mockEmployeeId));

Или же вы всегда можете использоватьОбъект ответа:

when(this.timeLogService.save(any(TimeLog.class)).thenAnswer(new Answer<TimeLog> {
    public TimeLog answer(InvocationOnMock invocation) throws Throwable {
        TimeLog receivedTimeLog = invocation.getArgumentAt(0, TimeLog.class);
        assertThat(receivedTimeLog.getEmployeeId(), equalTo(mockEmployeeId));
        return timeLog;
    }
});

Имеет ли это смысл?

...