2013-04-16 63 views
0

我想單元測試我的DAO,但我遇到了一些麻煩。春季休眠 - 單元測試dao

首先,我的DAO有1個方法:a findById類型的方法。我想爲此寫一個單元測試。所以,我的思路是:

  • 爲了測試這種方法,我需要插入一個已知的實體
  • 呼叫findById()在DAO,
  • ,然後斷言,我得到的回覆是什麼我最初插入。

現在,我遇到困難的部分是試圖找出如何做插入。

我的顧慮:

  1. 我目前沒有在我的DAO的insert方法。我可以寫一篇文章,但僅僅爲了測試的目的,我沒有看到這一點。

  2. 另一種可能是使用Hibernate API(即HibernateTemplate)來執行插入操作。但是,我希望我的單元測試是靈活的。我不想將我的單元測試綁定到任何特定的API。

我該怎麼辦?

+0

有一個快速的Google Mockito - 這是一個測試框架,可以讓您模擬結果。它並不完全回答你的查詢,但它絕對是一個開始尋找的地方。 – david99world

回答

2

根據您的數據庫(我傾向於使用內存中的變體進行測試),您應該能夠預先填充數據庫並在每次單獨測試之前將其設置爲已知狀態。所以沒有必要僅僅使用insert方法來進行測試。我已經使用過很多次的HSQLDB(現在已經被另一個數據庫取代,我不記得現在的名字),我通常創建數據庫並運行一些插入SQL語句來在每次測試之前填充數據庫。也有這樣的框架,如DbUnit

編輯

我在想的數據庫爲H2。現在看來似乎也有一個實用的功能,它可以execute a script when a connection is made

String url = "jdbc:h2:mem;INIT=runscript from '~/create.sql'\\;runscript from '~/populate.sql'"; 
1

一般來說,我不寫單元測試我的DAO。我更喜歡通過集成/功能測試來測試這個區域。

如果你想要的話,一個選項是預先填充數據庫,以便你的單元測試用例知道對數據庫的期望。

Spring提供了出色的DAO層測試框架,其中數據更改回滾,以便一個測試不會因數據更改而影響其他測試。

1

在配置集成測試的彈簧上下文時,您可以嘗試使用Spring's support for embedded databases<jdbc:script>標籤允許您執行初始化和銷燬​​腳本:

<jdbc:embedded-database type="H2" id="dataSource"> 
    <jdbc:script execution="INIT" location="setup.sql"/> 
    <jdbc:script execution="DESTROY" location="teardown.sql"/> 
</jdbc:embedded-database> 
+0

謝謝,我使用了一個嵌入式數據庫,它似乎工作得很好。不過,我在啓動時遇到問題。我正在使用hibernate,因此我的數據庫模式在我的映射文件中,這意味着我不應該編寫一堆CREATE TABLE語句。但是,如果我運行我的單元測試,我會得到一個異常說XXX表不存在。似乎正在發生的是它在創建模式之前運行我的插入語句。我該如何解決?再次感謝! – user2285410

+0

我認爲這個問題的每個解決方案都會有一定的代價。在這種情況下,價格是你需要維護模式創建腳本,但它並不是很糟糕:1)當hibernate.hbm2ddl.auto = create-drop使用'hibernate.show_sql = true'時,Hibernate基本上輸出腳本; 2)我想你可以在上面的xml配置中使用多個初始'