Как смоделировать clock.millis () в Java - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть код, в котором я вычисляю разницу между текущим временем часов и временем, сохраненным в моей базе данных. Если разница между этими двумя значениями превышает определенное значение, то я соответственно возвращаю результат. В этом случае я пытаюсь написать тест, но сталкиваюсь с проблемой насмешки Clock.millis (). Я привел некоторые ответы, но ни один из них не помог мне, кто-то может помочь мне с этим. This is my function

Для моего теста я хочу смоделировать эту функцию clock.millis () с фиксированным значением так что каждый раз, когда я запускаю тест, он принимает только это значение.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2020

A Clock предназначен для предоставления доступа к текущему моменту, дате и времени с использованием часового пояса. Вам не нужно издеваться над этим. Поскольку вашему классу необходимо получить текущий момент, он должен получить экземпляр Clock в конструкторе:

public class FooService {

    private final Clock clock;

    public FooService(Clock clock) {
        this.clock = clock;
    }

    public boolean isLocked() {
        long differenceInSecond = (clock.millis() - this.getLockedAt()) / 1000;
        return differenceInSecond < 7200;
    }

    private long getLockedAt() {
        ...
    }
}

Затем в своем тесте вы можете использовать fixed() часы, которые всегда возвращают одно и то же мгновение:

@Test
public void isLocked_shouldReturnTrue_whenDifferenceInSecondIsSmallerThan7200() {

    // Create a fixed clock, which will always return the same instant
    Instant instant = Instant.parse("2020-01-01T00:00:00.00Z");
    Clock clock = Clock.fixed(instant, ZoneOffset.UTC);

    // Create a service instance with the fixed clock
    FooService fooService = new FooService(clock);

    // Invoke the service method and then assert the result
    boolean locked = fooService.isLocked();
    assertThat(locked).isTrue();
}

В приложении Spring Boot вы можете выставить Clock как @Bean:

@Bean
public Clock clock() {
    return Clock.systemDefaultZone();
}

И тогда Spring позаботится о введении его в ваш сервис:

@Service
public class FooService {

    private final Clock clock;

    public FooService(Clock clock) {
        this.clock = clock;
    }

    ...
}
0 голосов
/ 18 февраля 2020

Вам нужно поместить Clock в свой собственный класс, выставив Clock.millis() в качестве делегата. В своем тесте вы можете затем высмеять свою обертку и вернуть все, что захотите.

...