簡體   English   中英

清除整個數據庫(使用Hibernate進行單元測試)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM