我正在尝试记录为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) {
...
}
}
答案 0 :(得分:0)
如果有未捕获的异常导致该类中的所有测试失败,则JUnit运行器将声明初始化错误。在JUnit结果中,您将看到单个initializationError。
RunListener javadoc表明大多数测试*方法只被称为“原子测试”,因为@Parameterized方法产生“原子测试”,所以不会发现这种情况。
看起来您需要查看testRunFinished方法,遍历其getFailures(),并查找引用initializationError的Failure对象。
更新: 由于@Parameterized方法在初始化测试运行器之前运行,因此您实际上可以创建一个新的测试方法来调用@Parameterized方法以确保@Parameterized方法有效。当然,这个新测试必须存在于@Parameterized类之外,但这是一个简单的重构。
如果@Parameterized方法偶尔会失败,这是一个有用的测试,如果您的参数来自外部源或频繁更改的源,则可能会发生这种情况。