如何设置Clock类让日期为执行当日、时间固定为23点
实现方案
场景1:测试启动时固定为当日23点,测试运行期间时钟不变(适用90%以上单测场景)
直接在初始化Clock时动态拼接当日日期和固定23点即可,代码如下:
private static final ZoneId KYIV_ZONE = ZoneId.of("Europe/Kiev"); private static final LocalTime TARGET_FIXED_TIME = LocalTime.of(23, 0, 0); @Spy Clock clock = Clock.fixed( ZonedDateTime.now(KYIV_ZONE) .with(TARGET_FIXED_TIME) .toInstant(), KYIV_ZONE );
说明:该方式会在测试类初始化时计算一次当日23点的时间,后续所有测试用例调用时钟都会返回同一个固定时间,不会受测试运行过程中跨零点的影响。如果需要调整23点的分秒参数,修改LocalTime.of的入参即可。
场景2:每次调用时钟时动态取最新当日日期拼接23点(适用特殊跨日期测试场景)
如果需要时钟始终返回调用时刻对应日期的23点,可以自定义Clock实现类:
public class FixedTimeDailyClock extends Clock { private final ZoneId zone; private final LocalTime fixedTime; public FixedTimeDailyClock(ZoneId zone, LocalTime fixedTime) { this.zone = zone; this.fixedTime = fixedTime; } @Override public ZoneId getZone() { return zone; } @Override public Clock withZone(ZoneId zone) { return new FixedTimeDailyClock(zone, this.fixedTime); } @Override public Instant instant() { return ZonedDateTime.now(zone) .with(fixedTime) .toInstant(); } }
使用方式:
@Spy Clock clock = new FixedTimeDailyClock( ZoneId.of("Europe/Kiev"), LocalTime.of(23, 0, 0) );
内容的提问来源于stack exchange,提问作者user16722881
相关产品推荐
相关产品推荐

