2011-03-10 32 views
2

我目前僅限於使用JRE 1.4(java運行時環境),並且我有一個具有一些當前時間計算的類。我試圖單元測試這個類,但它似乎很難,因爲我遇到的所有嘲笑工具都需要JRE1.4不支持的註釋。使用JRE 1.4嘲笑當前時間

我曾嘗試使用Jock 1.4友好版本的mockito,但不允許我模擬出靜態類。 Jmockit有一個超級簡單的解決方案,它提供下載,但似乎沒有成爲Jmockit的JRE1.4友好版本

有兩種方法我可以解決這個如果我使用JRE1.5以上已經得到了(模擬取出調用當前時間的方法或只是嘲笑當前的系統時間),但遺憾的是我不是。

唯一的解決方案是隻將當前系統時間傳遞給+/-日/月/年的方法。

然而,如果可能的話,我會在JRE 1.4環境下使用模擬方式。

謝謝

回答

0

我建議在處理靜態方法時使用包裝。例如,在你的情況,你可以使用TimeWrapper:

public class TimeWrapper() { 
    public long getCurrentTimeInMillis() { 
     return System.currentTimeMillis(); 
    } 
} 

注入TimeWrapper,當你必須讓你的其他類的當前時間。該解決方案不依賴於模擬框架和jdks。

+0

嗯,我忘了提及,我只是單元測試的類,而不是改變裏面的代碼。我之前嘗試做的事情是子類調用當前時間的方法,並在需要時插入該方法,但仍調用原始方法。 – yoshi594 2011-03-10 06:57:21

+0

我明白了。如果您不能更改代碼,請使用@UWe的解決方案,試試easymock。另一方面,混合模擬框架並不明智(其中一個原因是它們可能使用不同的JUnitRunner,這會使您的測試代碼難以閱讀和維護),所以如果您決定並使用easymock,則可能需要將您的舊的測試用例。 – Zsolt 2011-03-10 09:16:49

+0

是的,我會嘗試使用簡單的模擬。將讓你知道我是否成功=) – yoshi594 2011-03-11 01:45:38

0

easymock不需要註釋,所以它可以使用1.4。

+0

歡呼聲,我會試試這個,讓你知道它是如何變成:) – yoshi594 2011-03-11 01:45:53

0

或者爲所有時間相關的方法使用一個特殊的類,如DateHelper 然後你可以在你的UnitTests中嘲笑這個,並通過一個靜態變量來改變時間。

1

除了Zsolt的解決方案(創建一個包裝器),另一個可能的方法是提取對方法的調用,然後針對覆蓋該方法的子類進行測試。

代碼進行測試:

class A{ 
    protected long now(){ 
     return System.currentTimeMillis(); 
    } 
} 

單元測試:

class ATest{ 
    public void testStuff(){ 
     // actual test 
    } 

    class MyA extends A { 
     long currentTime; 

     protected long now(){ 
      return currentTime; 
     } 
    } 
} 

我喜歡的包裝方法,但子類可能在某些情況下是有用的。

+0

@ yoshi594我已經讀完Zsolt的回答後,寫我的意見。由於您無法更改代碼,因此此解決方案也無法使用。抱歉。 – JoaoHornburg 2011-08-23 20:36:04

2

爲什麼不簡單地使用Java 5僅用於測試代碼?使用體面的IDE,您應該可以爲測試代碼(Java 5+)和生產代碼(Java 1.4)分別創建模塊/項目。