2012-04-10 36 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)); 

這樣,你正在檢查這絕對不是你的較早的日期之前,你不必擔心繫統時鐘是否已更新或沒有。

相關問題