2015-04-25 71 views
1

我已經使用休眠功能將數據庫功能添加到內存中的系統,直到此時。當所有數據都是內存時,我可以使用Junit在每次測試後恢復原始數據。 有沒有一種方法可以實現與新增的休眠相同的結果? 「同樣的結果」我的意思是從數據庫處於初始狀態開始,測試哪些可以改變數據庫,並將數據庫恢復到原始狀態。在添加休眠數據庫後進行單元測試

到現在爲止,我的想法是:

  1. 在內存數據庫(這是一個休眠功能),但不會允許我用我的實際數據。
  2. 向我添加「測試標誌」如果設置,DOA不會提交更改。

我相信有更好的解決方案,但我還沒有找到更好的東西。

回答

0

我想我們應該明確單元測試的定義。單元測試只能在應用程序中測試一個小單元(一種公共方法)。

假設您有一個使用Hibernate與數據庫進行交互的DAO層。現在Hibernate使用需要數據源的SessionFactory。單元測試的數據源不應該與您的生產應用程序的數據源相同。

這個想法是定義一個測試數據源,並使用內存數據庫(hsqldb或任何其他)。對於每個測試用例,您都可以使用測試數據源對內存數據庫執行一些查詢,並在執行單元測試後清除它。對於每個單元測試,您應該執行查詢,以便爲特定測試完成測試數據設置。

對於例如:如果你想測試如下: 1)創建帳戶 2)更新帳戶 3)刪除帳戶

然後有三個測試場景,並可以有蜂多個單元測試可以爲每個的情況。

現在在執行創建帳戶測試之前,重要的是數據庫沒有此帳戶。然後調用DAO中的createAccount方法來測試它。無需驗證結果是否在數據庫中。只需檢查您的方法的返回,並且如果它與創建成功的帳戶時的預期相同,那麼您的測試用例應該通過。

對於更新帳戶,您的設置方法應該通過查詢插入一個帳戶,然後您必須在此帳戶ID中調用DAO中的updateAccount等。

請堅持單元測試的定義,不要一次性使用它來測試多個功能。

希望這會有所幫助。

+0

首先感謝您的答案,我不確定我的問題的哪一部分給人的印象是我使用單元測試來獲得更多的功能,但我向你保證事實並非如此。我的意思是我已經有很多已經寫好的單元測試,我正試圖找到一種方法來修改它們,所以它們不會損害數據。 我也需要這樣的集成測試,對於某些測試,我更願意使用我現有的數據而不是使用空白內存數據庫並自行填充,這就是爲什麼我要求使用我的原始數據庫和恢復的方法它。 – Shperb

0

你可以在每次測試之前啓動數據庫事務:

@PersistenceContext 
private EntityManager em; 

@Before 
public void init() { 
    em.getTransaction().begin(); 
} 

@After 
public void destroy() { 
    em.getTransaction().rollback(); 
} 

這樣,每個測試有在測試開始之前運行的交易,該交易被軋在測試結束後回來,所以你總是放棄所有改變當前的測試。

+0

,可以說我想添加用戶 - 添加用戶方法創建一個用戶實例並調用UserDAO來獲取會話,開始事務,添加新用戶,提交更改並關閉會話。所以我不認爲我可以應用你的解決方案,因爲提交是在方法中完成的。 – Shperb

+0

如果您正在進行手動交易和會話管理,那麼您確實贏了;無法使用此解決方案。如果您使用Spring或Java EE,以便您只使用@Transactional標記您的服務方法,這將是一個有效的選擇。 –

+0

你認爲在休眠的基礎上使用Spring還是Java EE更好?無論如何,我會研究它,但只是一個動機,我還能通過使用這些工具獲得什麼? – Shperb