【问题标题】:Fake system clock on certain date [duplicate]某个日期的假系统时钟[重复]
【发布时间】:2013-03-04 11:40:13
【问题描述】:

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

但它并没有给你太多提示如何设置假系统时钟,例如2.5.2013.

请帮帮我。

【问题讨论】:

  • 什么是挑战 - 设置时间,或计算出 Unix 时间与人类可读格式的时间和日期等效?
  • 我认为你应该早点检查一下post
  • 设置日期,以便测试“认为”它在特定日期运行。
  • 不可能以任何与系统无关的方式“伪造”系统时钟。在某些 JVM 上可能是可行的,但该技术不可移植。您必须更改操作系统报告的时间 - 更改您的硬件时钟。

标签: java testing


【解决方案1】:

假设您需要为测试操纵时间而不是真正更改系统时钟...考虑使用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 和自己实施解决方案之间的权衡!

【讨论】:

    【解决方案2】:

    一般来说,操纵系统日期时间不是一个好习惯,我仍然记得每次运行单元测试时我的前景如何变得疯狂,以及过去的各种提醒是如何弹出的。

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

    【讨论】:

      【解决方案3】:

      但它并没有给你太多提示如何设置假系统时钟,例如2.5.2013.

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

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

      【讨论】:

      • 也许我遗漏了一些东西,但这真的模拟了系统时钟,而不仅仅是在应用程序中返回某些日期?
      • @mjgirl 这就是重点。创建一个中间类,它将为生产代码中的系统时间提供服务。然后,当您需要测试特定的日期值时,您可以创建假的中间类,而不必费心模拟系统时钟。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多