我的设置是这样的。
内存数据库中的 H2 使用 JPA 连接,持久化上下文是使用 Spring 配置的。数据库设置脚本由 Flyway 运行来生成我的表并添加数据。
数据库 URL:jdbc:h2:mem:test_data
在我们的 JUnit 测试中,我们有像这样的 setUp 和 TeaDown 方法
@Override
protected void setUp() throws Exception {
this.context = new ClassPathXmlApplicationContext("classpath:/DataContext.xml");
this.data = this.context.getBean(DataProvider.class);
}
@Override
protected void tearDown( ) throws Exception {
this.context.close();
this.context = null;
this.data = null;
}
这里的目的是让每个 JUnit 测试获取它自己的数据库,这有时似乎确实有效,但有时似乎我得到的数据库与之前的测试相同。一个例子是我有 2 个测试:
public void testGetFoos()
{
Collection<Foo> foos= data.getFoos();
assertEquals(NUMBER_OF_FOOS,foos.size());
}
public void testSaveFoos()
{
Foo bar = makeDummyFoo();
data.saveFoo(bar);
Collection<Foo > foos = data.getFoos();
assertEquals(NUMBER_OF_FOOS + 1,foos.size());
}
这些方法应该能够以任何顺序运行,并且在运行 Maven 构建时,它们能够独立运行而不会相互影响,但是偶尔从 Eclipse 单独运行 JUnit 测试类时,它们会保存方法将首先运行,然后 get 方法将运行并得到错误的计数,因为它似乎在 mem 数据库中获得了与之前的测试方法相同的计数。
所以我的问题是如何使用 Spring 的设置在 JUnit 测试之间杀死内存数据库中的 H2?或者如果 context.close() 方法是正确的方法,那么什么可能导致它无法正确关闭?
最佳答案
我相信使用 DbUnit将是一个更好的方法;它正是为了这个目的而设计的。看看吧。
祝你好运。
关于java - 使用 JPA 和 JUnit 测试时如何一致地删除内存数据库中的 H2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573218/