把 Clock 注入业务,让时间测试可重现
直接调用 Instant.now 的代码很难稳定测试边界时间,尤其是过期判断与跨日逻辑。让测试依赖真实时钟也会制造偶发失败。
问题从哪里出现
直接调用 Instant.now 的代码很难稳定测试边界时间,尤其是过期判断与跨日逻辑。让测试依赖真实时钟也会制造偶发失败。
理解核心机制
把 Clock 当作依赖传入,生产使用系统时钟,测试使用 fixed 或 offset。这样业务函数仍在判断时间,而测试可以精确选择当前时间。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.time.*;
public class Demo {
static boolean expired(Instant deadline, Clock clock) {
return !clock.instant().isBefore(deadline);
}
public static void main(String[] args) {
Instant now = Instant.parse("2026-01-01T00:00:00Z");
Clock clock = Clock.fixed(now, ZoneOffset.UTC);
System.out.println(expired(now, clock));
System.out.println(expired(now.plusSeconds(1), clock));
}
}适用边界与常见误区
墙上时间可能被校正,不适合直接作为短时性能计时基准。测量经过时间通常使用 System.nanoTime,而不是日期时间差。
继续练习
分别测试截止前一纳秒、恰好截止和截止后一纳秒,明确边界是否算过期。