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