2012-04-10 57 views
3

我有一个单元测试,检查,以确保一个对象在我的实例与填充适当的创建日期:为什么Java Thread.sleep或Date.after()在其他计算机上的功能不同?

Date earlier = new Date(); 
    Thread.sleep(10); 
    instance.execute(); 
    assertTrue(instance.getMyObject.getCreationDate().after(earlier)); 

从Eclipse或用Ant运行时,这个测试对我的作品在Windows 7上的Java 6命令行。 但是,我的客户说这个测试对他来说是失败的(他没有指定他的环境)。这怎么可能?

+0

'instance.getMyObject.getCreationDate()'什么代码替代了这个? – 2012-04-10 13:07:36

+0

最好使用assertTrue的String参数来打印一些信息,这些信息可以帮助您理解为什么两个值是相同/不同的。 – oers 2012-04-10 13:11:31

回答

8

在Windows XP上,时钟分辨率仅为1/60秒。这意味着您可以等待10毫秒,时钟时间将显示为相同。我会把时间增加到100到250毫秒。

3

System.currentTimeMillis在不同平台上有不同的“分辨率”。 在Windows上它可以是15ms--这意味着你的10ms等待可能不一定会导致“更晚”的日期。

我会增加Thread.sleep(10)Thread.sleep(100)或更多。

1

正如Peter Lawrey所回答的,关于系统时钟的决议可能意味着它在创建“更早”日期和实例日期之间没有更新。也许你的代码更改为以下:

assertFalse(instance.getMyObject.getCreationDate().before(earlier)); 

这样,你正在检查这绝对不是你的较早的日期之前,你不必担心系统时钟是否已更新或没有。