如何通过@Parameters注释的JUnit测试方法中的错误通知

时间:2015-11-17 16:14:47

标签: java junit

我正在尝试记录为JUnit参数化测试创建参数时发生的错误。有没有办法在@Parameters注释的方法中发生故障时通知,而不修改方法来捕获异常?

使用@Parameters注释的方法似乎不会触发JUnit RunListener的testFailure()方法。

(以下是对显示代码的评论的回应)

这是我正在运行的代码的大纲:

(1)测试:(异常发生在' testCases()'方法中,在此方法中添加try / catch有效,但我试图避免这种情况,因为有数百个类似的测试)

@RunWith(MyParameterizedRunner.class)
public class MyTest {

    @Parameters
    public static List<String[]> testCases() {
      ... [**exception occurs here**]
    }
    ...
}

(2)Runner(在添加监听器之前,&#39; super(klass)&#39;调用似乎抛出了构造函数中的异常;我无法弄清楚如何捕获异常因为&#39; super(klass)&#39;必须是构造函数的第一行)

public class MyParameterizedRunner extends Parameterized {

    public MyParameterizedRunner(Class<?> klass) throws Throwable {
        super(klass);
    }

    @Override
    public void run(RunNotifier notifier) {
        notifier.addListener(new MyListener());
        super.run(notifier);
    }
}

(3)监听器:(在上述异常发生时尚未激活)

public class MyListener extends RunListener {
    public void testFailure( Failure fail) {
      ...
    }
}

1 个答案:

答案 0 :(得分:0)

如果有未捕获的异常导致该类中的所有测试失败,则JUnit运行器将声明初始化错误。在JUnit结果中,您将看到单个initializationError。

RunListener javadoc表明大多数测试*方法只被称为“原子测试”,因为@Parameterized方法产生“原子测试”,所以不会发现这种情况。

看起来您需要查看testRunFinished方法,遍历其getFailures(),并查找引用initializationError的Failure对象。

更新: 由于@Parameterized方法在初始化测试运行器之前运行,因此您实际上可以创建一个新的测试方法来调用@Parameterized方法以确保@Parameterized方法有效。当然,这个新测试必须存在于@Parameterized类之外,但这是一个简单的重构。

如果@Parameterized方法偶尔会失败,这是一个有用的测试,如果您的参数来自外部源或频繁更改的源,则可能会发生这种情况。