使用 Java 8 时钟对类进行单元测试
2022-08-31 12:43:27
引入了Java 8,它可以用作许多其他对象的参数,允许您向它们注入真实或虚假的时钟。例如,我知道您可以创建一个然后调用,它将返回您提供的固定。这听起来非常适合单元测试!java.time.Clock
java.time
Clock.fixed()
Instant.now(clock)
Instant
但是,我很难弄清楚如何最好地使用它。我有一个类,类似于以下内容:
public class MyClass {
private Clock clock = Clock.systemUTC();
public void method1() {
Instant now = Instant.now(clock);
// Do something with 'now'
}
}
现在,我想对这段代码进行单元测试。我需要能够设置生成固定时间,以便我可以在不同的时间进行测试。显然,我可以使用反射将成员设置为特定值,但是如果我不必诉诸反射,那就太好了。我可以创建一个公共方法,但这感觉不对劲。我不想向该方法添加参数,因为实际代码不应该关心传入时钟。clock
method()
clock
setClock()
Clock
处理此问题的最佳方法是什么?这是新代码,所以我可以重新组织类。
编辑:为了澄清,我需要能够构造一个对象,但能够让一个对象看到两个不同的时钟值(就好像它是一个规则的系统时钟滴答作响)。因此,我无法将固定时钟传递到构造函数中。MyClass