2013-03-04 54 views
0

我需要在測試中的特定日期設置系統時鐘。這樣我就必須模擬在測試下發生的那種行爲。我發現這篇文章http://www.javapractices.com/topic/TopicAction.do?Id=234特定日期的假系統時鐘

但它並沒有給你太多提示如何設置假系統時鐘例如2013年2月5日。

請幫幫我。

+0

什麼是挑戰 - 設置時間,或計算出Unix時間與人類可讀格式中的時間和日期等價嗎? – 2013-03-04 11:41:53

+0

我想你應該檢查此更早的[後](http://stackoverflow.com/questions/6203857/how-can-i-set-the-system-time-in-java)。 – 2013-03-04 11:42:43

+0

設置日期,以便測試類型「認爲」它在某個日期運行。 – mjgirl 2013-03-04 11:45:57

回答

0

一般來說,操縱系統日期時間不是一個好習慣,我仍然記得每次我跑單元測試時,我的前景如何變得瘋狂以及過去所有類型的提醒如何彈出。

您可以創建一個靜態類,它根據環境返回日期時間,所以在測試環境中。它將允許設置日期時間,您可以在實際運行時訪問它,它將返回系統日期/時間。

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(); 
    } 
} 
+0

也許我錯過了一些東西,但這是否真的模擬了系統時鐘,而不僅僅是返回應用程序中的某些日期? – mjgirl 2013-03-04 12:08:25

+0

@mjgirl就是這一點。創建一個在生產代碼中提供系統時間的中間類。然後,當您需要測試特定的日期值時,您可以創建假中間類,並且不要模擬系統時鐘。 – 2013-03-04 12:13:21

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和自己實施解決方案之間的權衡!