Spring + JUnit + H2 + JPA:是否可以为每次测试都删除创建数据库?

时间:2014-01-21 00:18:16

标签: spring jpa junit h2

为了保持JUnit测试之间的独立性,我需要在每次测试开始时创建数据库,并在每次测试结束时销毁它。

应该通过执行SQL文件中存在的SQL查询在内存(H2数据库)中创建数据库(本机插入查询...)。

在属性文件中定义我的键值并遵守JPA规范(persistence.xml),如何使用注释/注入为每个JUnit测试创建drop-database?

非常感谢你!

3 个答案:

答案 0 :(得分:25)

您应该能够使用Spring的嵌入式数据库配置来指定H2数据源(也显示为here):

<jdbc:embedded-database id="dataSource" type="H2">
    <!-- Modify locations appropriately for your environment -->
    <jdbc:script location="classpath:db-schema.sql"/>
    <jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:embedded-database>

应该使用适当的命名空间声明进入特定于测试的testApplicationContext.xml

Spring将在测试套件(测试类)的开头显示测试应用程序上下文时创建H2数据源。因为Spring在测试类的持续时间内缓存应用程序上下文,所以可以使用@DirtiesContext注释测试类,以便为每个测试方法重新创建应用程序上下文并重新初始化数据源:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/your/testApplicationContext.xml"})
@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
public class SomeDatabaseTest {

    @Autowired
    private SomeDao dao;

    // Test methods
}

可以找到有关Spring的嵌入式数据库功能的更多信息here

答案 1 :(得分:3)

您应该使用JPA或Spring功能,但仅仅是为了完整性:

在数据库方面,H2支持running init scripts when opening the database,如下所示:

jdbc:h2:mem:test;INIT=runscript from '~/create.sql'

jdbc:h2:mem:test;INIT=runscript from 'classpath:/com/acme/create.sql'

当您关闭内存数据库(如上例所示)时,数据将被删除。或者您可以运行SQL语句drop all objects

答案 2 :(得分:-1)