WMX · 随记
·Java· 3 分钟阅读

把 Clock 注入业务,让时间测试可重现

直接调用 Instant.now 的代码很难稳定测试边界时间,尤其是过期判断与跨日逻辑。让测试依赖真实时钟也会制造偶发失败。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

直接调用 Instant.now 的代码很难稳定测试边界时间,尤其是过期判断与跨日逻辑。让测试依赖真实时钟也会制造偶发失败。

理解核心机制

把 Clock 当作依赖传入,生产使用系统时钟,测试使用 fixed 或 offset。这样业务函数仍在判断时间,而测试可以精确选择当前时间。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java12 行 · 可横向滚动
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,而不是日期时间差。

继续练习

分别测试截止前一纳秒、恰好截止和截止后一纳秒,明确边界是否算过期。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档