我正在运行一个用@Test
注释的方法,我希望获得对象JunitCore
的引用,该对象通过反射调用该方法。
我如何获得对该对象的引用,如果有可能?(可能是安全问题)
我尝试了reflection
和classLoader
,但我无法让它发挥作用。
谢谢
答案 0 :(得分:3)
JUnitCore
是Junit
测试的基本入口点。它的工作方式是找到List
类作为java
命令参数提供的类,并使用它们创建一个运行测试用例的Runner
。
在处理期间,main
中的JUnitCore
方法从未将其创建的JUnitCore
实例的引用传递给任何其他对象。因此,无法直接或通过反射进行检索。
JUnitCore
如下
public static void main(String... args) {
runMainAndExit(new RealSystem(), args);
}
public static void runMainAndExit(JUnitSystem system, String... args) {
Result result= new JUnitCore().runMain(system, args);
system.exit(result.wasSuccessful() ? 0 : 1);
}
public Result runMain(JUnitSystem system, String... args) {
system.out().println("JUnit version " + Version.id());
List<Class<?>> classes= new ArrayList<Class<?>>();
List<Failure> missingClasses= new ArrayList<Failure>();
for (String each : args)
try {
classes.add(Class.forName(each));
} catch (ClassNotFoundException e) {
system.out().println("Could not find class: " + each);
Description description= Description.createSuiteDescription(each);
Failure failure= new Failure(description, e);
missingClasses.add(failure);
}
RunListener listener= new TextListener(system);
addListener(listener);
Result result= run(classes.toArray(new Class[0]));
for (Failure each : missingClasses)
result.getFailures().add(each);
return result;
}
... // and more
此实现中的任何位置都不是对作为参数传递的this
的引用。因此,您无法获得对它的引用。
答案 1 :(得分:0)
唯一的方法是创建一个JunitCore
实例并自己运行测试:
JUnitCore junit = new JUnitCore();
//we can add a listener to listen for events as we run the tests
junit.addListener(new RunListener(){
@Override
public void testFailure(Failure failure) throws Exception {
System.out.println("failed " + failure);
}
});
Result result = junit.run(Class.forName(nameOfTestSuite));