清除整个数据库(使用Hibernate进行单元测试)

时间:2010-09-05 15:52:26

标签: java unit-testing hibernate

我的单元测试使用Hibernate连接到内存中的HSQLDB数据库。我希望有一种方法可以在JUnit的TestCase.setUp()方法中清除和重新创建数据库(包括模式和所有数据的整个数据库)。

5 个答案:

答案 0 :(得分: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显式关闭时,将删除数据库模式。

e.g。验证|更新|创建|创建降

如果您不喜欢在真正的hibernate配置中使用此配置,则可以创建一个hibernate配置以进行单元测试。

答案 1 :(得分:3)

如果您使用的是Spring,那么您可以在单元测试中使用@Transactional属性,默认情况下,在每个单元测试结束时,所有持久化数据都将自动回滚,因此您无需担心丢弃表每一次。

我在这里走了一个例子http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html

答案 2 :(得分:2)

hibernate.hbm2ddl.auto=create-drop

引导一个新的SessionFactory

答案 3 :(得分:1)

从测试的角度来看,最佳做法是在每次测试后清除数据。如果使用create-drop,它也将删除表模式。这会导致每次重新创建模式的开销。

由于您使用的hsql提供了截断的直接机制,因此在这种情况下它将是最佳选择。


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

答案 4 :(得分:1)

小心擦拭世界,每次都重新开始。很快,你可能会想要开始使用&#34;默认&#34;系统中加载的测试数据集。因此,您真正想要的是在每次测试运行之前恢复到该基本状态。在这种情况下,您需要在每次测试运行之前使用事务回滚

要完成此任务,您应该注释您的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() {
    ...
}