如何使用 mockito 模拟 LocalDatTime.now()?

How to mock LocalDatTime.now() using mockito?

我正在为我的业务编写单元测试 class,我想根据我的测试将 LocalDateTime 模拟到特定时间。这是我的功能:

    private fun isExpired(access: Access): Boolean {
        return access.validUntil.isAfter(LocalDateTime.now())
    }

如何模拟 LocalDateTime.now()

我的建议是注入对 Clock 的依赖并在您的方法中使用它。抱歉,我已经转换为 Java,因为我对 kotlin 不太熟悉。

class ClassToTest {
    private final Clock;

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

    private boolean isExpired(Access access) {
        return access.validUntil.isAfter(LocalDateTime.now(clock));
    }
}

并且使用固定 'now' 的测试看起来像:

@Test
void testIsExpired() {
    Clock clock = mock(Clock.class);
    when(clock.instant()).thenReturn(Instant.ofEpochSecond(1000L));
    when(clock.getZone()).thenReturn(ZoneOffset.UTC);
    ClassToTest test = new ClassToTest(clock);
    assertThat(test.isExpired(access))...
}

您特别询问了模拟,但您可以使用恒定时钟实现相同的效果:

@Test
void testIsExpired() {
    Clock clock = Clock.fixed(Instant.ofEpochSecond(1000L), ZoneOffset.UTC);
    ClassToTest test = new ClassToTest(clock);
    assertThat(test.isExpired(access))...
}

您的生产代码将注入您想要的任何时钟(例如特定 TZ、本地 TZ、每秒滴答的时钟等),这些都是使用静态 Clock 方法创建的。更改时钟的能力通常是一个非常有用的功能,除了它的测试价值之外。