2011-09-15 46 views
8

我喜歡爲我的hibernate dao實現編寫JUnits,並就編寫這些單元測試用例的建議方法徵求意見。我可以想到兩種策略。春季單元測試hibernate daos

  • 使用像EasyMock這樣的庫嘲諷休眠模板,並測試這些模擬對象的DAO實現。 (不是真的滿足,因爲我會針對測試數據真的測試對一個模擬層,而不是)

  • 測試對一個真正的測試數據庫(在內存/外)運行我的單元測試之前寫了一些測試數據。

哪一種方法是確保我們的DAO的好方法正確測試。請指點我使用第二種方法配置測試的任何示例。我試圖環顧四周,但還沒有找到合適的。

謝謝, Siva。

+1

只是想添加到augusto的評論,你可以使用DBUnit填充您的測試數據庫與數據查詢。 – jwmajors81

回答

5

我會按照第二種方式,使用HSQLDB作爲數據庫引擎。我認爲調用DAO背後的真正實現具有捕獲映射錯誤的積極作用。

如果您的DAO有更多的邏輯,它與處理hibernate無關(想象一下,如果DAO加載了一些對象,然後對它們執行一些操作以返回不同的對象),我會創建一個不同的測試類來測試具有額外邏輯的方法,並模擬返回數據的方法。這允許您以更簡單的方式設置數據,而不是啓動數據庫並立即加載這些對象。

3

針對真實數據庫進行測試。 Hibernate的大部分複雜性都在映射中,如果你嘲笑SessionFactory(或封裝它),那麼你完全錯過了測試。使用Spring Test Framework可以大大簡化您的測試,並且可以針對本地「單元」測試對內存數據庫進行測試。 H2使用簡單,速度非常快(比HSQLDB或Derby更好)。例如:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("your test context.xml") 
public class FooDaoTest { 
    @Autowired 
    private FooDao dao; 

    @Transactional 
    public void saveFoo_succeeds() { 
     // test save 
    } 

    @Transactional 
    public void saveAndLoadFoo_resultsInSameFieldValues() { 
     // save and load; compare fields from before to after 
    } 

    // test custom queries 
}