我有两个测试类:A和B. 主要问题是JUnit在执行A的@AfterClass之前进入B的@BeforeClass。
通常这不是什么大问题,但现在我必须在共享数据库上工作,这样就失败了。
样品:
public class A {
@AfterClass
public static void clearDb(){
try{
...
EntityManager em = ..
em.getTransaction().begin();
em.createQuery("DELETE FROM ClassName").executeUpdate();
em.getTransaction().commit();
}catch(...){...}
}
@Test
public test(){
...
}
}
public class B {
@BeforeClass
public static void clearDb(){
try{
...
EntityManager em = ..
em.getTransaction().begin();
em.clear();
em.persist(...)
em.getTransaction().commit();
}catch(...){...}
}
@Test
public test(){
...
}
}
连接:jdbc:h2:mem:test; DB_CLOSE_DELAY = -1
我的问题是:有没有办法强制JUnit作为单个线程处理,或者等到其他类真正清理它的东西。
答案 0 :(得分:1)
您是否考虑过使用JUnit Rule注释?
您可以创建抽象类处理数据库状态
import org.junit.Rule;
import org.junit.rules.ExternalResource;
public abstract class AbstractTest {
public Object dbConnection;
@Rule
public ExternalResource resource = new ExternalResource() {
@Override
protected void before() {
System.out.println("Setting up resource");
// set up dbConnection
}
@Override
protected void after() {
System.out.println("Cleaning up resource");
// clean db dbConnection
}
};
public Object getDbConnection() {
return dbConnection;
}
}
然后你的测试会扩展你的抽象类
import org.junit.Assert;
import org.junit.Test;
public class SampleTest extends AbstractTest {
@Test
public void firstTest() {
Object connection = getDbConnection();
// interact with db using the provided connection
System.out.println("do work 1");
}
@Test
public void secondTest() {
Object connection = getDbConnection();
System.out.println("do work 2");
}
}
答案 1 :(得分:1)
老问题,但如果有人需要它:
当我从很多地方得知时,没有办法保证After。@ BeforeClass和Earlier。@ AfterClass方法的命令。最终的解决方案是我使用了不同的H2数据库。