Как задать значение для LocalTime.now()?

Тестирую сервис при помощи JUnit 5 и Spring Test. В сервисе есть проверка: перед выполнением действия вытаскивается LocalTime.now() и проверяется, что сейчас меньше 11:00, в противном случае выбрасывается ошибка.

Сейчас на часах 22:42. А значит тесты будут валиться, пока я не дождусь полночи. Времени у меня не так много, поэтому хочу узнать: есть ли возможность задать определённое значение времени, чтобы оно возвращалось при вызове LocalTime.now()?

Я могу использовать класс Clock, но что мне с ним делать? Я же не смогу подменить часы в сервисе, а он будет обращаться к стандартным часам.


Ответы (1 шт):

Автор решения: Zhenyria

Решил довольно просто, без изысков. Вынес получение времени из сервиса в отдельный утильный класс:

public class VoteUtil {
    private static LocalTime endVoteTime = LocalTime.of(11, 0);

    private VoteUtil() {
    }

    public static boolean isCanReVote() {
        return LocalTime.now().isBefore(endVoteTime);
    }

    public static void prepareEndVoteTimeForPassTests() {
        if (LocalTime.now().getHour() >= endVoteTime.getHour()) {
            endVoteTime = LocalTime.of(23, 59);
        }
    }

    public static void prepareEndVoteTimeForFailTests() {
        if (LocalTime.now().getHour() < endVoteTime.getHour()) {
            endVoteTime = LocalTime.of(0, 1);
        }
    }
}

Последние два метода - продвинутые сеттеры. Первый выставляет время так, чтобы тесты проходили, а второй - чтобы падали.

→ Ссылка