运行 对任何测试只设置和拆卸一次 JUnit 运行

Run JUnit setup and teardown exactly once for any test(s) run

在每次 JUnit 测试之前,我 运行 需要设置一些东西。需要加载一些属性,需要建立数据库连接,需要启动单独的 J2SE 应用程序等。当每个测试完成后,可以终止数据库连接并关闭 J2SE 应用程序。

我可以通过在测试套件中使用@BeforeClass 和@AfterClass 注释来完成此操作,但这限制了我只能在套件内进行 运行 测试。如果我想 运行 套件外的单独测试,它不会 运行 套件设置和拆卸方法。同样,如果我想 运行 一个单独的测试方法(通过 IDE),它不会 运行 套件的设置和拆卸。

有没有一种方法可以设置 JUnit 测试,以便无论它们如何 运行,通过套件、测试用例或单独的方法,它们总是 运行设置方法 only 在 运行ning 之前执行一次,并且在每个测试执行后拆卸 only 一次?让所有测试用例都使用静态初始化程序扩展抽象 class 可以解决设置问题,但不能解决拆卸问题。

我能够使用两种不同的方法完成所需的工作。如果只有一种方法有效,我会更喜欢,但这会...

我有一个实现 testRunFinished:

的自定义 RunListener class
public class MyRunListener extends RunListener
{
    @Override
    public void testRunFinished(Result result) throws Exception
    {
        //Do whatever teardown needs to be done
    }
}

然后我有一个自定义的 BlockJUnit4ClassRunner class 使用以下 运行() 方法:

private static boolean listenerAdded = false;
@Override 
public void run(RunNotifier notifier)
{
    //listenerAdded required or else the listener will be added once for every test case, and testRunFinished will be run multiple times
    if(!listenerAdded)
    {
        listenerAdded = true;
        notifier.addListener(new MyRunListener());
    }
    super.run(notifier);
}

抽象测试用例class使用注解:

@RunWith(MyRunner.class)

我希望我也可以在 MyRunListener 中实现 testRunStarted,但它没有用。显然在 MyRunner 中添加这样的侦听器,直到 之后才添加侦听器,testRunStarted 方法本应 运行,因此它不会被执行。如原始问题中所述,解决方法是在 AbstractTestCase:

中使用静态启动器
@RunWith(MyRunner.class)
public class AbstractTestCase
{
    private static boolean setupDone = false;
    static
    {
        if(!setupDone)
        {
            setupDone = true;
            //Do whatever setup needs to be done
        }
    }
...

如果有人知道添加 MyRunListener 的方法,这将允许使用 testRunStarted,那会很好,但与此同时,这是可行的。