使用类名Java获取对象的引用

时间:2013-09-30 23:38:41

标签: java junit

我正在运行一个用@Test注释的方法,我希望获得对象JunitCore的引用,该对象通过反射调用该方法。

我如何获得对该对象的引用,如果有可能?(可能是安全问题)

我尝试了reflectionclassLoader,但我无法让它发挥作用。

谢谢

2 个答案:

答案 0 :(得分:3)

JUnitCoreJunit测试的基本入口点。它的工作方式是找到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));