2012-10-09 87 views
2

我正在尋找一種使用jUnit測試DAO類的最佳實踐。我的DAO類有幾個典型的DAO方法,如createUser(用戶用戶),deleteUser(Long id),updateUser(用戶用戶),findUserById(Long id)...使用jUnit進行DAO測試的設計模式

因此,createUser可以很容易,一個用戶,並檢查它是否有一個id後。如果是,測試會通過。 你還是願意創建一個用戶,讀取數據庫的用戶事後並檢查它是否 1)找到用戶 2)從返回的用戶實例變量是從保存的用戶同樣喜歡

之前,現在那麼deleteUser函數呢?它需要一個ID,但爲了獲得ID,我首先必須創建一個用戶。那麼如何做到這一點?使用test方法中的testCreateUser方法或DAO類中的createUser方法?

與updateUser(用戶用戶)相同的東西,我需要一個用戶先更新和findUserById(長ID)我需要一個Id第一。

我認爲我的要求很常見,所以我想知道是否有像使用jUnit測試DAO的設計模式。

謝謝,保羅

回答

1

IMO單元測試應該能夠自行運行。

因此,例如,刪除測試將首先創建一個用戶,然後刪除它並檢查它是否不存在(通過嘗試加載它)。

依靠先前的測試不是一個好方法,因爲如果以前的測試因任何原因失敗,下一次測試也將失敗。

1

我通常的做法是用相同的測試中DAO的其他方法。例如

user = UserStore.create(...); 
id = user.id(); 
loadedUser = UserStore.load(id); 
assertThat(loadedUser, eq(user)); 

如果採取這種做法,「單位」的單元測試是類作爲一個整體,而你通常單元測試在時間的函數。這是可以接受的,並且會導致經過良好測試的課程。這種方法的問題是,失敗的測試可能是由於UserStore.create或UserStore.load中的錯誤,但我發現使用小類時,調試並不困難,並且往往工作得很好。我嘗試了其他方法,在測試後手動檢查數據庫,但是我發現額外的工作通常不值得。

一些框架,如Rails,採取不同的方法。它們爲您在測試運行之前爲數據庫提供數據的種子提供了一種方法。這很好,因爲這個框架很容易。也許這將成爲規範,因爲更多的工具爲這種方法提供支持。

2

恕我直言,沒有這樣的設計模式來做JUnit測試。有必須參考的最佳實踐。

例如,在下面的情況下,您在刪除之前不使用testCreateUser方法來創建用戶。你必須爲此使用DAO類。每個測試用例方法都是相互獨立的。

現在deleteUser函數怎麼樣?它需要一個ID,但爲了獲得ID,我將首先創建一個用戶,以 。那麼 這個怎麼辦?使用測試方法中的testCreateUser方法或DAO類中的createUser方法?

現在,要解決您的問題,您可以使用setUp和tearDown方法。在setUp方法中,您可以創建要測試的模擬對象,並在tearDown中刪除它們。如果你這樣做,每個testmethod將得到你可以測試的同一套模擬數據。

1

您可以使用內存數據庫在每次測試之前充滿您的測試數據,並在測試執行完成後放棄。看看Derby

要考慮的另一件事是,你真的應該測試你的DAO層嗎? Dao的定義不應該包含業務邏輯,並且最終你會測試持久性框架。