作为 Java 代码的一部分,明天需要在 JUnit 中完成一些任务。
例如有3个任务:
- 任务1 - 完成
- task2 - 明天做
- task3 - 然后这会发生
因此,根据要求,我需要在 Java 中将今天的日期设置为明天。
您的问题的根源是系统时钟(在 a 中为您提供时间new Date ()
)没有为您提供测试所需的时间。
您可以通过引入一定程度的间接来避免这个问题。不是让您的代码直接询问 Java API 当前时间是多少,而是让您的代码询问一个Clock
对象时间是什么。在实际程序中,您的Clock
实现使用系统时钟。对于您的单元测试,您使用 a FakeClock
,它表示您想要的任何时间。你告诉你的代码Clock
使用依赖注入来使用什么。您必须自己编写Clock
接口(或抽象基类)及其具体实现。
这种方法需要您更改现有代码,因此更容易测试。或者首先编写它,以便更容易测试。这是单元测试的技巧之一。
我目前正在处理一些对时间敏感的代码。我的时钟界面很简单
public interface Clock {
long getCurrentTime ();
}
关键是将“可以为您提供当前时间的东西”的想法提取为依赖项。(连同相关时区。)
所以不要使用new Date()
orSystem.currentTimeMillis()
你使用Clock
抽象。对于生产代码,您注入一个使用底层系统时钟的实例,但对于测试,您使用可以显式控制的假时钟,以使其返回您想要的任何内容。
(说实话,目前还不清楚你想要达到的目标是什么——但这种方法是我让时间可测试的标准方法。)
考虑 GitHub 上的以下代码:DateSupplier && DateController。DateSupplier
有一个返回当前日期的静态方法。允许您操作在测试环境DateController
中返回的日期值。DateSupplier
它是一个JUnit Rule
并自行清理。
Clock
这是其他两个答案中想法的具体实现。我已经在我的项目中使用它一年左右并取得了很好的成功。任何时候我有代码可以代替new Date()
我打电话。DateSupplier.getCurrentDate()