我正在尝试从 Ant(1.8.2,支持 junit4)执行一些 Arquillian 测试,但似乎 Ant 任务没有调用 RunNotifier.fireTestRunFinished() 并且 Arquillian 测试运行器依靠此来取消部署 arquillian-jmx 战争从容器中。JUnit 的 Eclipse 集成调用 fireRestRunFinished 方法,一切都从那里正常工作。
我环顾了junit javadoc并在RunNotifier中看到了这个:
public void fireTestRunFinished(Result result)
Do not invoke.
此外,类 javadoc 描述是这样说的:
此类的未来发展可能会将 fireTestRunStarted(Description) 和 fireTestRunFinished(Result) 移至单独的类,因为它们每次运行只能调用一次。
但它没有指定它将被移动到哪里。
查看junit的源代码,我看到调用fireTestRunFinished的唯一地方是这个方法内部:
/**
* Do not use. Testing purposes only.
*/
public Result run(Runner runner) {
Result result= new Result();
RunListener listener= result.createListener();
fNotifier.addFirstListener(listener);
try {
fNotifier.fireTestRunStarted(runner.getDescription());
runner.run(fNotifier);
fNotifier.fireTestRunFinished(result);
} finally {
removeListener(listener);
}
return result;
}
如您所见,它说...不要调用。
我的问题是,当所有测试完成运行时,JUnit 计划如何通知自定义运行器?如果不使用当前的 API,是否还有其他可用的 API?现在我的选择是修改 Arquillian runner 以不再依赖 RunListener 或调用 RunNotifier.fireTestRunFinished 的 ant 任务。无论哪种方式,我都必须更改我不拥有的代码……这显然不是我的第一选择。
...或者我可以扩展 Arquillian 运行器,覆盖 run() 方法并执行 RunListener 在 super.run() 之后执行的操作。
有没有人看到任何其他方式解决这个问题?