使用GRADLEW BUILD运行时如何在每个测试类之间删除H2数据库?

时间:2017-06-16 06:16:35

标签: java junit h2 in-memory-database

民间,

请在以下登记的查询中帮助我 -

我正在使用H2数据库进行JUnit测试。 我正在测试注册和登录。因此,在这两种情况下,我都需要在每个测试类中创建我在@BeforeClass中创建的用户。现在,当我运行单个类测试用例时,它工作正常(原因是:它创建用户执行测试用例并自动删除,因为我使用H2 DB)。但是当我运行gradlew构建时,它会在第一个测试类之后失败。它给了我错误" data.helper.ErrorException:用户ID必须是唯一的。" 关于如何在每个类之间删除数据库,我们将不胜感激。

由于

5 个答案:

答案 0 :(得分:0)

您可以在每个截断表的测试中添加@Before方法。这有助于避免单个测试类中测试的副作用。

@Before
public void truncateTables() {
    //truncate tables
}

答案 1 :(得分:0)

您可以使用 DbUnit 库以方便的方式处理您的问题。在测试用例之前填充数据库并在之后清除它。见http://dbunit.sourceforge.net/howto.html

注意创建H2数据库配置字符串。数据库必须存活,直到JVM关闭。 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

答案 2 :(得分:0)

您应该使用@Before而不是@BeforeClass,以便在每个测试方法之前运行设置代码,而不是在整个类中运行一次。您还可以添加@After方法,以便在每种测试方法后执行任何清理。

答案 3 :(得分:0)

如果您使用的是春季启动,请参阅此stack overflow问题。

类注释@DirtiesContext将导致在每个测试用例之间删除上下文

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)

答案 4 :(得分:0)

如果使用的是jdbi2框架,则可以使用类似的方法在测试之间清除H2数据库对象:

public class H2JDBIRule extends ExternalResource {

    private Handle handle;

    //...

    public void dropDatabase() {
        handle.begin();
        handle.execute("DROP ALL OBJECTS");
        handle.commit();
    }

    //...

}

只需确保您在测试用例类中引用了它,如下所示:

@ClassRule
public static H2JDBIRule rule = new H2JDBIRule();

@After
public void tearDown(){
    rule.dropDatabase();
}