首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中更改时钟实例的内部状态?

如何在Java中更改时钟实例的内部状态?
EN

Stack Overflow用户
提问于 2020-10-20 00:54:13
回答 1查看 60关注 0票数 0

我有一个验证日期过期的服务:

代码语言:javascript
复制
@RequiredArgsConstructor
public class ExpirationVerificationService {
  private final Clock clock;

  public boolean hasPassed(Instant instant) {
    return Instant.now(clock).isAfter(instant);
  }
}

我想验证一下,随着时间的推移,hasPassed是否返回不同的值:

代码语言:javascript
复制
public class ExpirationVerificationServiceTest {

  private ExpirationVerificationService service;
  private Clock clock;

  @BeforeEach
  public void init() {
    clock = Clock.fixed(Instant.EPOCH, ZoneId.of("UTC"));
    service = new ExpirationVerificationService(clock);
  }

  @Test
  public void testHasExpired() {
    Instant instant = Instant.now(clock).plus(Duration.ofDays(30);
    assertFalse(service.hasPassed(instant));

    // TODO move clock to future
    assertTrue(service.hasPassed(instant));
  }

}

如何将Clock实例的内部状态更新为将来的状态?

注意:我正在测试的实际业务逻辑比本例复杂得多(验证来自数据库的Oauth令牌的过期时间),我不能只使用过去的不同Instant实例。

EN

回答 1

Stack Overflow用户

发布于 2020-10-20 01:01:55

Clock实际上只是一个Instant的提供者。您可以简单地声明一个固定时钟,如下所示:

代码语言:javascript
复制
Instant fixedInstant = Instant.EPOCH;
Clock clock = () -> fixedInstant;

因此,如果你想要一个可设置的Clock,你可以声明:

代码语言:javascript
复制
AtomicReference<Instant> theInstant = new AtomicReference<>(Instant.EPOCH);
Clock clock = () -> theInstant.get();

然后更新theInstant

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64431899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档