在JUnit测试夹具中设置时间和日期

时间:2013-06-21 07:06:33

标签: java junit

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

例如,有3个任务:

  • task1 - 已完成
  • task2 - 明天再做。
  • task3 - 然后就会发生

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

4 个答案:

答案 0 :(得分:9)

问题的根源在于系统时钟(在[{1}}中给你的时间)并没有给你测试所需的时间。

您可以通过引入间接级别来避免此问题。您没有让代码直接询问Java API当前时间,而是让您的代码向new Date ()对象询问时间。在实际程序中,Clock实现使用系统时钟。对于您的单元测试,您使用Clock,表示您想要的任何时间。您告诉您的代码使用依赖注入来使用FakeClock。您必须自己编写Clock接口(或抽象基类)及其具体实现。

这种方法要求您更改现有代码,因此更容易测试或首先编写代码,因此更容易测试。这是单元测试的诀窍之一。

我正在研究一些对时间敏感的代码。我的时钟界面就是

Clock

答案 1 :(得分:5)

关键是要提取“能够给你当前时间的东西”的想法作为依赖。 (连同相关时区。)

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

(说实话,目前还不清楚你要实现的目标 - 但这种方法是我时间可测试的标准方法。)

答案 2 :(得分:3)

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

这是来自其他两个答案的Clock想法的具体实现。我已经在我的项目中使用了一年左右,取得了很好的成功。每当我有new Date()代码时,我会调用DateSupplier.getCurrentDate()

答案 3 :(得分:2)

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

DateTimeUtils.setCurrentMillisFixed(long millis);

可以在你的测试中使用。