禁用JUnit并发测试 - BeforeClass,AfterClass问题

时间:2014-06-17 15:02:26

标签: java junit

我有两个测试类: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作为单个线程处理,或者等到其他类真正清理它的东西。

2 个答案:

答案 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数据库。