某个日期的假系统时钟

时间:2013-03-04 11:40:14

标签: java testing

我需要在测试中的某个日期设置系统时钟。这样我就必须模拟测试日期发生的行为。我发现了这篇文章http://www.javapractices.com/topic/TopicAction.do?Id=234

但它没有给你很多提示如何设置假系统时钟,例如2013年2月5日。

请帮帮我。

3 个答案:

答案 0 :(得分:2)

假设您需要为测试操作时间而不是真正改变系统时钟...考虑使用Joda-Time,它具有烘焙功能,例如:

// always return the same time when querying current time
DateTimeUtils.setCurrentMillisFixed(millis);

// then test 
assert new DateTime().getMillis() == millis;

// reset time
DateTimeUtils.setCurrentMillisSystem() 

你必须权衡利用Joda-Time和自己实施解决方案之间的权衡!

答案 1 :(得分:0)

一般情况下操纵系统日期时间不是一个好习惯,我还记得每次运行单元测试时我的前景如何变得疯狂以及过去的所有类型的提醒都会出现。

您可以创建一个静态类,它根据环境返回日期时间,因此在测试环境中。它将允许设置在实际运行时可以访问的日期时间,它将返回系统日期/时间。

答案 2 :(得分:0)

  

但它没有给你很多提示如何设置假系统时钟,例如2013年2月5日。

确实如此。我想您按照步骤操作,并使用接口(例如TimeSource)替换所有对系统时间的调用。如果需要模拟特定日期,可以在测试类中使用以下实现:

public final class TestTimeSrc implements TimeSource {

  public long currentTimeMillis() {
     Calendar calendar = Calendar.getInstance();
     calendar.set(2013, 4, 2);
     return calendar.getTime().getTime();
  }
}