2013-06-24 20 views
2

我一直在閱讀關於使用PowerMock模擬Java中的System Date函數的一些答案,但似乎有必要將註釋添加到實際的類中正在測試。讓我稍微提出這個問題。我在一家大公司實習,在一個使用Spring,JUnit,Mockito等的系統上進行單元測試。我目前的任務是測試一個依賴於當前時間依賴於數據庫的端點(有點像檢查截止日期)。在Java中修改Date()而不更改src代碼

我的問題是:是否可以或直觀地在測試類中模擬System Date而不觸及主源代碼?我不想修改源代碼;即使它在測試環境中,我寧願保持它不變。或者更改數據庫條目以更改日期,執行我的測試,然後使用事務性測試回滾更有意義?謝謝一堆!

我試圖嘲弄的類是:java.util.Date cDate = new java.util.Date();

+0

「是有可能的或直觀嘲笑在測試類的系統日期不接觸的主要源代碼?」 < - 是的,使用參數化測試。但是,考慮到您使用的是JUnit,這並不容易。如果您使用過TestNG,那將會輕而易舉。 – fge

+0

你如何確定系統日期?新日期()? Calendar.getInstance()?我不緊張你在任何一種情況下都需要修改被測試的類。你能分享被測試的課程嗎? (或者你至少需要模擬一下?) – DaveH

+0

我編輯了我的問題;我想模擬java.util.Date() – jmeanor

回答

0

我知道這不是一個簡單的解決方案,但你可以使用byteman(https://community.jboss.org/wiki/ABytemanTutorial)快速前進的日期在系統屬性中找到的天量。在一個名爲addDaysToJvmDate.btm文件複製這樣的:

RULE Calling java.util.Date() 
CLASS java.util.Date 
METHOD <init>() 
AT EXIT 
IF TRUE 
DO $0.fastTime = java.lang.System.currentTimeMillis() + (86400000 * java.lang.Long.parseLong(java.lang.System.getProperty("addDays"))); 
ENDRULE 

,並使用啓動JVM:

java - javaagent:${BYTEMAN_HOME}/lib/byteman.jar=script:addDaysToJvmDate.btm,boot:${BYTEMAN_HOME}/lib/byteman.jar -cp yourclasspath yourapp