如何使用 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
方法创建的。更改时钟的能力通常是一个非常有用的功能,除了它的测试价值之外。
我正在为我的业务编写单元测试 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
方法创建的。更改时钟的能力通常是一个非常有用的功能,除了它的测试价值之外。