Spring Junit H2 JPA:是否可以为每个测试删除数据库



要保持junit测试之间的独立性,我需要在每个测试的开头创建数据库,并在每个测试结束时将其销毁。

应通过执行SQL文件中存在的SQL查询(本机插入查询...)。

来创建数据库(H2数据库)。

在属性文件中定义我的键值并尊重JPA规范(Persistence.xml),如何使用注释/注射为每个JUNIT测试为每个JUNIT测试创建Drop数据库?

非常感谢!

您应该能够使用Spring的嵌入式数据库配置指定H2 DataSource(也在此处显示):

<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 DataSource。因为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
}

可以在此处找到有关春季嵌入式数据库功能的更多信息

您可能应该使用JPA或春季功能,但仅出于完整性:

在数据库侧,H2在打开数据库时支持运行的初始脚本:

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

jpa2.1初始化EMF时支持模式的滴和创建。

最新更新