为了保持JUnit测试之间的独立性,我需要在每次测试开始时创建数据库,并在每次测试结束时销毁它。
应该通过执行SQL文件中存在的SQL查询在内存(H2数据库)中创建数据库(本机插入查询...)。
在属性文件中定义我的键值并遵守JPA规范(persistence.xml),如何使用注释/注入为每个JUnit测试创建drop-database?
非常感谢你!
答案 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)