【问题标题】:Run JUnit setup and teardown exactly once for any test(s) run为任何测试运行只运行一次 JUnit 设置和拆卸
【发布时间】:2016-10-07 20:43:20
【问题描述】:

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

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

有没有办法设置 JUnit 测试,以便无论它们如何运行,通过套件、测试用例或单个方法,它们始终只运行一个设置方法在运行任何东西之前进行一次,并且在每次测试执行后进行一次拆卸?让所有测试用例扩展一个带有静态初始化器的抽象类可以解决设置问题,但不能解决拆卸问题。

【问题讨论】:

  • @mre 该解决方案仅适用于初始设置。如果我有一个仅在 tearDownIsDone 为 false 的情况下运行的 tearDown 方法,它将在第一个类完成后运行,而不是在 每个 类完成后运行。我需要一个适用于设置和拆卸的解决方案。

标签: java junit java-7 junit4


【解决方案1】:

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

我有一个实现 testRunFinished 的自定义 RunListener 类:

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

然后我有一个自定义 BlockJUnit4ClassRunner 类,它具有以下 run() 方法:

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);
}

一个抽象的测试用例类使用注解:

@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
        }
    }
...

如果有人知道添加允许使用 testRunStarted 的 MyRunListener 的方法,那就太好了,但与此同时,它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多