2010-09-05 56 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() { 
    ... 
} 
相关问题