【发布时间】:2016-07-22 15:21:23
【问题描述】:
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的行为类型。这将为此处遵循的方法提供信息。 -
跟进:我认为它基本上归结为你不能真正使用
Clock.fixed进行单元测试,就像我希望的那样。将需要正常的模拟方法。
标签: java unit-testing java-8 java-time