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

How to drop H2 database between each test class when running with GRADLEW BUILD?

各位,

请协助我解决以下入伍问题-

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

之间删除数据库的任何帮助将不胜感激

谢谢

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

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

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

注意创建H2数据库配置字符串。在 JVM 关闭之前,数据库必须处于活动状态。 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

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

如果您使用的是 spring 引导,请参阅此 问题。

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

@DirtiesContext(class模式=DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)

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

public class H2JDBIRule extends ExternalResource {

    private Handle handle;

    //...

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

    //...

}

只需确保在测试用例中引用它 class 如下所示:

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

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