2013-08-27 85 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... 


更新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; 

更新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())将返回true当且仅当该方法是静态的,所以你可以做这个检查你居然叫invoke之前。 如果你还没有Method对象,那么类似ClassgetMethod将对你有用。

关于MethodModifierClass的文档。


编辑:以上全部是检查你通过invoke调用之前的方法是否是静态的帮助。如果你想使用类似jmockit的东西来发现已经调用了这种方法,那么我个人想知道这将如何帮助您获得IllegalArgumentException,特别是如果它被抛出invoke因为你正在尝试做什么异常消息说是不允许的。即使你可以嘲笑它,也可能涉及更深层次的问题。

+0

正确。所以,我创建了一个嵌套类的实例,我在外部类的一个方法中使用'new'。在我的测试中,我现在得到这样的嵌套实例:'final Field runnable = MyClass.class.getDeclaredField(“nestedClassInstance”); runnable.setAccessible(true);'我无法从'runnable'获得方法,但我不知道为什么。我使用'getDeclaredMethods()'和'getMethods()'打印了所有的方法。 – Saad

+1

因此,getDeclaredMethods()和getMethods()是不是回不了你想要的方法? (我假设你也尝试过'getMethod()') –

+0

我没有尝试getMethod(),尽管我可能会花一些时间尝试。谢谢你的帮助。 – Saad

相关问题