我使用Spring 3.2,Hibernate和JUnit 4中Spring @Transactional在JUnit測試中不起作用?
吾道類如下:
@Transactional public class SomeDaoImpl implements SomeDao {
對這項工作的更新操作,如果直接從Web應用程序執行。但是,我看到運行更新方法的junit集成測試實際上並未持續進行更改。當junit方法執行時,事務是否會回滾?
我使用Spring 3.2,Hibernate和JUnit 4中Spring @Transactional在JUnit測試中不起作用?
吾道類如下:
@Transactional public class SomeDaoImpl implements SomeDao {
對這項工作的更新操作,如果直接從Web應用程序執行。但是,我看到運行更新方法的junit集成測試實際上並未持續進行更改。當junit方法執行時,事務是否會回滾?
通過reference,事務處理是而不是在Spring的測試上下文中持續存在。如前所述,雖然不常見,但如果您仍然需要這樣做,則可以使用@TransactionConfiguration
和@Rollback
更改默認行爲。
DAO不應該是事務性的。 DAO如何知道它是否應該參與更大的交易?
服務應該在典型的Spring分層體系結構中擁有事務。
對數據庫運行單元測試的典型做法是回退。你不想讓你的測試改變數據庫,除非你已經建立了一個可以隨意刪除和重新創建的測試數據庫。
這個問題應該是:您的測試如何寫入,如何進行交易?如果你永遠不會提交,你永遠不會看到記錄。
From the "Testing" section of the docs,您可以使用
@Rollback(false)
註釋如果你不希望基於SpringJUnit4ClassRunner來回滾事務。
對不起應該補充說我使用hibernate進行持久化。 – Nilesh
不會改變我的答案。 – duffymo
無論如何,它不應該是你的回答評論:-)。順便說一句,你上面提到的最佳做法是很好的發表。我認爲你迷失在試圖迂腐,忘記回答真正的問題! – Nilesh