10

作为 Java 代码的一部分,明天需要在 JUnit 中完成一些任务。

例如有3个任务:

  • 任务1 - 完成
  • task2 - 明天做
  • task3 - 然后这会发生

因此,根据要求,我需要在 Java 中将今天的日期设置为明天。

4

4 回答 4

11

您的问题的根源是系统时钟(在 a 中为您提供时间new Date ())没有为您提供测试所需的时间。

您可以通过引入一定程度的间接来避免这个问题。不是让您的代码直接询问 Java API 当前时间是多少,而是让您的代码询问一个Clock对象时间是什么。在实际程序中,您的Clock实现使用系统时钟。对于您的单元测试,您使用 a FakeClock,它表示您想要的任何时间。你告诉你的代码Clock使用依赖注入来使用什么。您必须自己编写Clock接口(或抽象基类)及其具体实现。

这种方法需要您更改现有代码,因此更容易测试。或者首先编写它,以便更容易测试。这是单元测试的技巧之一。

我目前正在处理一些对时间敏感的代码。我的时钟界面很简单

 public interface Clock {
    long getCurrentTime ();
 }
于 2013-06-21T07:22:17.480 回答
7

关键是将“可以为您提供当前时间的东西”的想法提取为依赖项。(连同相关时区。)

所以不要使用new Date()orSystem.currentTimeMillis()你使用Clock抽象。对于生产代码,您注入一个使用底层系统时钟的实例,但对于测试,您使用可以显式控制的假时钟,以使其返回您想要的任何内容。

(说实话,目前还不清楚你想要达到的目标是什么——但这种方法是我让时间可测试的标准方法。)

于 2013-06-21T07:17:23.747 回答
5

考虑使用Joda Time,它是 Java 日期和时间类的替代品。它提供

DateTimeUtils.setCurrentMillisFixed(long millis);

可以在您的测试中使用。

于 2013-06-21T14:02:07.310 回答
3

考虑 GitHub 上的以下代码:DateSupplier && DateControllerDateSupplier有一个返回当前日期的静态方法。允许您操作在测试环境DateController中返回的日期值。DateSupplier它是一个JUnit Rule并自行清理。

Clock这是其他两个答案中想法的具体实现。我已经在我的项目中使用它一年左右并取得了很好的成功。任何时候我有代码可以代替new Date()我打电话。DateSupplier.getCurrentDate()

于 2013-06-21T10:46:22.420 回答