2010-09-05 58 views
6

我的單元測試使用Hibernate連接到內存中的HSQLDB數據庫。我希望有一種方法可以在JUnit的TestCase.setUp()方法中清除並重新創建數據庫(包括模式和所有數據的整個數據庫)。清理整個數據庫(用Hibernate進行單元測試)

+3

如果您正在測試您的數據庫,然後國際海事組織不是單元測試。 – Jamie 2010-09-05 16:07:05

+0

我正在測試我的程序碰巧使用數據庫。 – 2010-09-05 16:14:28

+0

我正在測試一個用於訪問數據庫中的數據的類 – Lu55 2015-06-17 22:17:32

回答

7

你可以配置你的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配置。

+3

這隻會在每次運行時重新創建它。這意味着如果你從eclipse運行你的測試,許多人會失敗,如果單獨運行會通過。至少這是我的經驗。 – 2013-05-14 23:20:08

2
hibernate.hbm2ddl.auto=create-drop 

並引導一個新的SessionFactory

+2

僅在使用JPA時如何完成此操作? – Konsumierer 2011-08-19 12:35:55

0

從測試的角度來看一個例子,最好的做法是每一個測試之後清除數據。如果您使用創建 - 刪除,它也將刪除表架構。這會導致每次重新創建模式的開銷。

由於您使用的是提供直接截斷機制的hsql,在這種情況下它將是最好的選擇。


@After 
public void clearDataFromDatabase() { 
    //Start transaction, based on your transaction manager 
    dao.executeNativeQuery("TRUNCATE SCHEMA PUBLIC AND COMMIT"); 
    //Commit transaction 
} 
1

小心擦拭世界,重新開始新的每次。很快,您可能希望從系統中加載的一組「默認」測試數據開始。因此,你真正想要的是在每次測試運行之前恢復到基本狀態。在這種情況下,您需要一個交易,在每次測試運行前回滾

要做到這一點,你應該註釋你的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() { 
    ... 
} 
相關問題