[英]Clearing Entire Database (for unit testing with Hibernate)
我的單元測試使用Hibernate連接到內存中的HSQLDB數據庫。 我希望有一種方法可以在JUnit的TestCase.setUp()
方法中清除並重新創建數據庫(包括模式和所有數據的整個數據庫TestCase.setUp()
。
您可以配置hibernate配置文件以強制數據庫每次都重新創建表和模式。
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create-drop</property>
hibernate.hbm2ddl.auto創建SessionFactory時,自動驗證或將架構DDL導出到數據庫。 使用create-drop,當SessionFactory顯式關閉時,將刪除數據庫模式。
例如驗證| 更新| 創建| 創建降
如果您不喜歡在真正的hibernate配置中使用此配置,則可以創建一個hibernate配置以進行單元測試。
如果您使用的是Spring,那么您可以在單元測試中使用@Transactional屬性,默認情況下,在每個單元測試結束時,所有持久化數據都將自動回滾,因此您不必擔心每次都丟棄表。
我在這里走了一個例子http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html
hibernate.hbm2ddl.auto=create-drop
並引導一個新的SessionFactory
。
從測試的角度來看,最佳實踐是在每次測試后清除數據。 如果使用create-drop,它也將刪除表模式。 這會導致每次重新創建模式的開銷。
由於您使用的是hsql,它提供了截斷的直接機制,因此在這種情況下它將是最佳選擇。
@After
public void clearDataFromDatabase() {
//Start transaction, based on your transaction manager
dao.executeNativeQuery("TRUNCATE SCHEMA PUBLIC AND COMMIT");
//Commit transaction
}
小心擦拭世界,每次都重新開始。 很快,您可能希望從系統中加載的“默認”測試數據集開始。 因此,您真正想要的是在每次測試運行之前恢復到該基本狀態。 在這種情況下,您需要一個在每次測試運行之前回滾的事務 。
要完成此任務,您應該注釋您的JUnit類:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/path/to/spring-config.xml"})
@TransactionConfiguration(transactionManager="myTransactionManager", defaultRollback=true)
public class MyUnitTestClass {
...
}
然后使用@Transactional注釋每個測試方法:
@Transactional
@Test
public void myTest() {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.