繁体   English   中英

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

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

各位,

请协助我进行以下查询-

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

谢谢

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

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

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

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

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

如果您使用的是 Spring Boot,请参阅此堆栈溢出问题。

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

@DirtiesContext(classMode = 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();
    }

    //...

}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM