2013-08-27 2 views
1

Как проверить, что был вызван нестатический метод частного вложенного класса? Это то, что я до сих пор:Проверка вызова нестатического метода частного статического вложенного класса статического внешнего класса

new Verifications() { 
    { 
     Deencapsulation.invoke(MyClass.class.getDeclaredClasses()[0], "run"); 
     times = 4; 
    } 
}; 

я получаю это:

java.lang.IllegalArgumentException: Attempted to invoke non-static method without an instance to invoke it on... 


Update 1:

@Dennis, я попытался следующие, хотя я Получая NPE. Я хотел бы проверить работу метода run против синглтона, который уже находится в JVM, и не создавать его новый экземпляр (как в приведенном ниже коде), чтобы вызвать метод m. Я пробовал звонить m.invoke(null) без успеха. Есть ли способ проверить вызов (через его вызов) в jmockit нестатического метода в частном вложенном классе, используя отражение в исполняемом экземпляре внешнего класса?

new Verifications() { 
     Class c = MyClass.class.getDeclaredClasses()[0]; 
     Method m = c.getDeclaredMethod("run"); 
     //Method m = MyClass.class.getDeclaredClasses()[0].getDeclaredMethod("run", Integer.class, CallableClient.class); 

     //Deencapsulation.invoke(MyClass.class.getDeclaredClasses()[0], "run"); 
     Class[] a = new Class[] { Integer.class, CallableClient.class}; 
     Object cc = Deencapsulation.newInstance(c, a); 
     //Object cc = Deencapsulation.newInstance(c, withInstanceOf(Integer.class), withInstanceOf(CallableClient.class)); 
     { 
      try { 
       System.out.println(MyClass.class.getDeclaredClasses()[0].getName()); 
       m.invoke(cc); 
       times = 3; 

Update 2:

После безуспешных попыток получить метод, как это: final Field runnable = MyClass.class.getDeclaredField("nestedClassInstance"); runnable.setAccessible(true);, а затем с помощью getDeclaredMethods(), а также getMethods(), я решил, что это слишком много плохого с этим подходом, чтобы продолжить это. Я изменил то, что тестирую в своем тесте. Несмотря на то, что я представил экземпляр внутреннего вложенного класса, я предполагаю, что причина, по которой я не могу увидеть метод run, может быть связана с одним или всеми из: вложенным характером его содержащего класса, конструкторов и java поведение/решение не отображать методы экземпляра, пока оно не сможет обеспечить успешное построение экземпляра. Любопытно узнать, почему я не мог, хотя, с уверенностью.

+0

Вы ищете способ узнать во время работы? Это можно сделать через отражение. –

+0

Да, я. Как будет выглядеть этот подход? – Saad

+0

Для этого требуется экземпляр внешнего класса, которого я избегаю, хотя, возможно, нет другого выбора, кроме как его создать: http: // jmockit.googlecode.com/svn/trunk/www/tutorial/ReflectionUtilities.html. Нет никакого публичного конструктора или какого-либо общедоступного метода для получения/экземпляра внешнего класса. – Saad

ответ

2

Поскольку вы сказали, что хотите узнать, пытаетесь ли вы вызвать нестатический метод во время выполнения, тогда этот бит рефлексии должен помочь.

Предполагая m является Method экземпляр, соответствующий вашему методу, то Modifier.isStatic(m.getModifiers()) возвращает истину, если и только если метод является статическим, так что вы можете сделать эту проверку, прежде чем вы на самом деле назвать invoke. Если у вас еще нет объекта Method, то вам будет полезно что-то вроде Class's getMethod.

Документы на Method, Modifier и Class.


EDIT: Все вышеперечисленное полезно для проверки, является ли или не метод является статическим, прежде чем вызывать его через invoke. Если вы хотите использовать что-то вроде jmockit, чтобы узнать, что такой метод был вызван, то я лично задаюсь вопросом, как это поможет IllegalArgumentException, который вы получаете, особенно если его бросает invoke, потому что вы пытаетесь сделать то, что говорит сообщение об исключении. Даже если бы вы могли издеваться над этим, это могло бы затронуть более глубокую проблему.

+0

Исправить. Итак, я создал экземпляр вложенного класса, который я 'new' в методе внешнего класса. В моем тесте, теперь я получаю вложенный экземпляр следующим образом: 'final Поле runnable = MyClass.class.getDeclaredField (" nestedClassInstance "); runnable.setAccessible (true); 'Мне не удалось получить метод из' runnable', хотя я не знаю почему. Я напечатал все методы, используя 'getDeclaredMethods()', а также 'getMethods()'. – Saad

+1

Итак, 'getDeclaredMethods()' и 'getMethods()' не возвращает метод, который вам нужен? (и я предполагаю, что вы попробовали 'getMethod()' также) –

+0

Я не пробовал getMethod(), хотя я могу попробовать его, как только я получу некоторое время. Спасибо за вашу помощь. – Saad

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