引入了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
对象,但必须能够使一个对象看到两个不同的时钟值(好像是常规系统时钟一样)。因此,我无法将固定时钟传递给构造函数。
MyClass
。这将为此处遵循的方法提供依据。