我有一些测试基础设施类,我想将它们添加为 JUnitCore 的侦听器,特别是针对 testRunFinished。我正在从 ant 的任务中调用 Junit 4。
有什么方法可以让我访问由任务创建的 JUnitCore 以便我可以添加一个侦听器?
Not from ant's junit task.
You best write a main method that runs your test suite "manually".
package test;
import org.junit.runner.Request;
import org.junit.runner.Result;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
public class RollYourOwnTestRun {
public static void main(String[] args) {
Runner runner = Request.classes(StackTest.class).getRunner();
RunNotifier notifier = new RunNotifier();
Result result= new Result();
RunListener listener= result.createListener();
notifier.addListener(listener);
notifier.addListener(...); // add your listener
notifier.fireTestRunStarted(runner.getDescription());
runner.run(fNotifier);
notifier.fireTestRunFinished(result);
}
}
@RunWith注释可能会有所帮助(有一些轻微的 API 最佳实践违规):您提供自己的 Runner,然后覆盖run(RunNotifier notifier)
. 通过 RunNotifier,您可以使用 add*Listener-API,目前仅标记为内部。祝你好运!
这有点晚了,但您可以尝试将您的包装RunListener
成 ant's JUnitResultFormatter
(from org.apache.ant:ant-junit
):
import static org.apache.tools.ant.taskdefs.optional.junit.JUnitVersionHelper.getTestCaseClassName;
import static org.apache.tools.ant.taskdefs.optional.junit.JUnitVersionHelper.getTestCaseName;
import static org.junit.runner.Description.createTestDescription;
public class MyJunitFormatter implements JUnitResultFormatter {
private final MyListener delegate = new MyListener();
@Override
@SneakyThrows(Exception.class)
public void endTest(Test test) {
delegate.testFinished(
createTestDescription(
getTestCaseClassName(test),
getTestCaseName(test)));
}
// ....