在linux中模拟“更快的时间”

时间:2009-03-08 19:28:52

标签: java linux testing date time

我有一个在Linux上运行的Java应用程序,它有很多围绕时间和日期的事件和业务逻辑。

对于测试,是否有可能更快地调整某些内容。比方说,在一小时的墙上时间完成一整年的计算机完成?

4 个答案:

答案 0 :(得分:9)

您可以为时间/日期调用编写包装器界面。有一个真正的实现,可以执行真正的系统调用,以及一个可以执行任何操作的测试实现(运行速度更快,速度更慢,假日期等)。

答案 1 :(得分:7)

最适合单元测试的一种方法是抽象代码中访问当前时间的方式。

不是直接调用System.currentTimeMillis(),而是提供自己的实现。

像这样的东西(伪代码):

class MyTime {
   private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();

   public setTimeInterface(TimeInterface timeInterface) {
      CurrentTimeInterface = timeInterface;
   }

   public int getTime() { CurrentTimeInterface.getTime(); }

}

class DefaultTimeImpl implements TimeInterface {
   public int getTime() { return System.currentTimeMillis(); }
}

class TestTimeImpl implements TimeInterface {
   private int CurrentTimeMillis = 0;
   public int getTime() { return CurrentTimeMillis; }
   public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
   public void sleep(int millis) { CurrentTimeMillis += millis; }
}

然后,无论你在哪里调用System.getTimeMillis()而不是调用MyTime.getTime()。在测试代​​码时,只需创建一个TestTimeImpl并调用MyTime.setTimeInterface(testTimeImpl)。然后当你想要时间提前调用testTimeImpl.sleep()或testTimeImpl.setTime()。

这使您可以模拟毫秒级的任何时间。

答案 2 :(得分:2)

如果您是系统调用以获取系统时间(即System.currentTimeMillis()),则可以通过更改系统时间来加快时间。这应该反映在您在申请中看到的时间。

如果您正在使用其他方式计算时间(从JVM开始经过的时间(即System.nanoTime()),净时间服务器等...)那么答案就是不可能。


我不能强调我只是在解释如何做你所要求的事情,这只适用于集成测试,当你考虑到你在机器上影响的任何其他事情时。

这不应该作为适当和广泛的单元测试的替代品。

答案 3 :(得分:0)

您必须设计系统,以便在测试期间“重新安排”时钟。对于某些类系统,有一个事件队列,它按时间顺序存储调度事件。在模拟中的任何时刻,下一个事件是队列中的第一个项目;您可以将其从队列中拉出来,并调整有效时间,使其与该事件发生的时间相匹配。在安排新事件时,它们会被添加到队列中。因此,您可以在系统允许的情况下尽快处理事件,而不必等待实际时间过去。但是你必须设计你的系统才能让这种机制起作用。