如何验证已调用私有嵌套类的非静态方法?这是我到目前为止所拥有的:
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 中已经存在的单例验证方法的运行,而不是创建它的新实例(就像我在下面的代码中所做的那样)以调用 method 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()
as well as getMethods()
,我认为这种方法有太多错误,无法继续这样做。我已经改变了我在测试中测试的内容。尽管我介绍了内部嵌套类的实例,但我假设我看不到该run
方法的原因可能与以下一项或全部有关:其包含类的嵌套性质、构造函数和 java 的行为/decision 在可以确保成功构建实例之前不显示实例方法。很想知道为什么我不能,当然。