验证调用静态外部类的私有静态嵌套类的非静态方法

时间:2013-08-27 20:40:17

标签: java jmockit

如何验证是否已调用私有嵌套类的非静态方法? 这就是我到目前为止所做的:

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中的单例运行,而不是创建它的新实例(就像我在下面的代码中所做的那样),以便调用方法{{1 }}。我试着调用m但没有成功。有没有办法在外部类的运行实例上使用反射验证私有嵌套类中非静态方法的jmockit中的调用(通过它的调用)?

m.invoke(null)

更新2:

尝试获取此方法后失败: 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; 然后使用final Field runnable = MyClass.class.getDeclaredField("nestedClassInstance"); runnable.setAccessible(true);以及getDeclaredMethods(),我认为这种方法有太多错误无法继续有了这个。我已经改变了我在测试中测试的内容。尽管我介绍了一个内部嵌套类的实例,但我假设我无法看到getMethods()方法的原因可能与其中一个或全部有关:其包含类的嵌套特性,构造函数和java的行为/决定不显示实例方法,直到它可以确保实例的成功构造。好奇地知道为什么我不能确定。

1 个答案:

答案 0 :(得分:3)

既然你说你想知道你是否试图在运行时调用非静态方法,那么这一点反思应该会有所帮助。

假设m是与您的方法对应的Method实例,那么当且仅当方法是静态时,Modifier.isStatic(m.getModifiers())才会返回true,因此您可以在实际调用之前执行此检查invoke。 如果您还没有Method对象,那么Class getMethod之类的内容对您有用。

MethodModifierClass上的文档。


编辑:在通过invoke调用方法之前,上述所有方法都有助于检查方法是否为静态。如果你想使用像jmockit这样的东西能够发现这样的方法已被调用,那么我个人想知道这对你所获得的IllegalArgumentException有什么帮助,特别是如果它被抛出按invoke ,因为您尝试执行异常消息所说的内容是不允许的。即使你可以嘲笑它,这可能会涉及更深层次的问题。