[英]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.