如何验证是否已调用私有嵌套类的非静态方法? 这是我到目前为止有:验证静态外部类的私有静态嵌套类的非静态方法的调用
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的嵌套特性行为/决定不显示实例方法,直到它可以确保实例的成功构建。好奇地知道为什么我不能确定。
您是否在寻找一种在运行时查找的方法?通过反思是可行的。 –
是的,我是。这种方法会是什么样子? – Saad
这需要一个外部类的实例,但我不得不创建它:http:// jmockit。googlecode.com/svn/trunk/www/tutorial/ReflectionUtilities.html。没有公共构造函数,也没有任何公共方法来获取外部类的实例 – Saad