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;
}
...
}