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

hi5*_*hi5 6 java junit

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

例如,有3个任务:

  • task1 - 完成
  • task2 - 明天再做
  • task3 - 然后就会发生这种情况

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

Rae*_*ald 9

你的问题的根源在于系统时钟(给你时间的东西new Date ())并没有给你测试所需的时间.

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

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

我正在研究一些时间敏感的代码.我的时钟界面很简单

 public interface Clock {
    long getCurrentTime ();
 }
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

关键是要提取"可以给你当前时间的东西"的想法作为依赖.(连同相关时区.)

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

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


Ste*_*ner 5

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

DateTimeUtils.setCurrentMillisFixed(long millis);
Run Code Online (Sandbox Code Playgroud)

可以在您的测试中使用。