2013-09-30 2 views
0

Я запускаю метод, аннотированный с помощью @Test, и я хочу получить ссылку на объект JunitCore, этот объект вызывает метод путем отражения.Получить ссылку на объект, используя имя класса Java

Как я могу получить ссылку на этот объект, если это возможно? (Может быть, проблема безопасности)

Я попытался reflection и classLoader, но я не мог заставить его работать.

Благодаря

+2

Если JUnit не имеет способ впрыснуть или дать вам ссылку на 'JunitCore', вы не можете получить его, даже с отражение. –

+0

Почему? Что вы пытаетесь достичь – Steinar

+0

Что случилось с 'new JunitCore()'? –

ответ

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 передается в качестве аргумента. Таким образом, вы не можете получить ссылку на него.

+0

Я знаю, что у меня нет ссылки, нет способа получить код с кодом, если нет способа, почему? – Felquir

+0

@Felquir Вам нужно поговорить с создателями Junit, вот как он был разработан. –

+0

Я спрашиваю вас, почему я не могу получить ссылку на объект из jvm во время выполнения. – Felquir

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)); 
+0

Извините, если я запускаю другой процесс, результат не будет отображаться в плагине. Спасибо за ваш интерес – Felquir

Смежные вопросы