java - 使用 JPA 和 JUnit 测试时如何一致地删除内存数据库中的 H2

标签 java spring jpa junit flyway

我的设置是这样的。

内存数据库中的 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/

相关文章:

java - spring boot 使用环境加载 yml 来映射

java - 为什么 EclipseLink 查询缓存仅在我使用 query.getSingleResult() 时才起作用?

java - JPA OneToMany 在插入另一行时删除第一行(在多方)

java - 在java中从列表或数组列表中删除中间元素的最佳方法?

java - Spring Boot日志文件相对于jar目录而不是启动目录

java - 在 JDBC 中获取列名

java - 如何从 pom 编辑器中删除 org.apache.maven.plugin.jar.JarMojo 错误

java - spring data rest 存储库中的更新方法

java - 在 Spring 事务管理器中创建 bean 时出错

java - 哪种方法对碱基和排序速度更优?