2012-04-24 49 views
0

我將不得不編寫測試用例來檢查某些查詢的工作說,這檢索與日期今天next_week,previous_year記錄等。日期和日期時間處理 - 一個特定的場景中失敗

它的JUnit測試用例基本上,我正在通過實施:

1.Inserting記錄與日期對應到今天,NEXT_WEEK,PREVIOUS_YEAR

2.So,我就知道一個特定查詢,要返回的記錄是什麼,我將執行查詢,檢索特定條件的記錄並檢查它是否有正確的記錄。

在這個過程中,在執行TODAY的情況下,我面臨一個問題。

如果我在午夜運行我的測試情況下,說11.59,數據的第一插入會發生,這將插入一個日期,說24-4-2012T11:59:00.00

和在執行之前查詢,日期變爲明天,即25-4-2012T00:00:00.00

「今日」條件將執行查詢,查詢次數爲25次而不是24次。所以我的測試用例失敗了。

我該如何解決這個問題?

回答

5

我該如何解決這個問題?

多寫測試代碼:)

我的猜測是,你正在做的「當前日期」使用System.currentTimeMillis()Calendar.getInstance()或類似的東西。該代碼不容易被攔截,給你「任何你想要的價值」。相反,使用單一方法(now()或類似方法)引入一個接口,返回您想要使用的「現在」的任何表示形式。 (個人情況下,我會使用Joda Time中的Instant,但這取決於您。)

現在將Clock注入要測試的代碼中,例如,作爲參數構造函數。對於測試,使用一個存根實現,它返回你想要的任何東西。對於生產,使用「真實」的實現。

+0

謝謝Jon Skeet。我是否理解正確,我必須從我自己的Clock中返回一個now()值,該值將被插入到數據庫中,然後在查詢中用於檢索? – Sowmiya 2012-04-26 09:34:27

+0

@Sowmiya:你是否使用它來插入是一個不同的問題(我們不知道數據代表什麼) - 但你至少會用它來查詢,以便你知道「今天」是什麼意思。 – 2012-04-26 09:40:25

+0

在這裏,我的檢索過程就像,我將發射一個服務GetRecordsForToday,在那裏我不能指定任何日期,但該服務負責在後端操縱日期Today。 [我正在測試使用一個服務的**插入的工作**和**使用另一個服務的檢索 - 今天總是在今天** :(] – Sowmiya 2012-04-26 09:47:51

0

假設您使用new Date()作爲今天的概念。您應該保留保留的比較日期;我相信這是問題的根源,你需要之前和查詢執行後保留的預期值是可測試/可驗證:

Date today = new Date(); 

// update the data layer using today 

Date recordedDate = // fetch the date that is recorded 

assertEquals(today, recordedDate); 

想必,你會使用一些其他的設施,如java.util.Calendar計算時間在你的問題中提到的點。

+0

但是這個解決方案與原來的問題相同 - 日期可能會在兩個調用'new Date()'之間改變。 – 2012-04-24 06:48:17

+0

只有_on_調用'new Date()'在'today'中預先保存它;這就是我想要的代碼聽起來像。 – nobeh 2012-04-24 06:54:47

+0

感謝您的提示。但基本上,我將在午夜存儲日期並保存它。我需要從數據庫查詢今天的日期值並檢查保留的日期,以查詢[明天的第一分鐘會發生哪種情況]。那麼,在這種情況下,它會失敗嗎? :) – Sowmiya 2012-04-24 11:38:38