2

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

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 在可以确保成功构建实例之前不显示实例方法。很想知道为什么我不能,当然。

4

1 回答 1

3

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

假设mMethod与您的方法对应的实例,则Modifier.isStatic(m.getModifiers())当且仅当该方法是静态时才会返回 true,因此您可以在实际调用之前进行此检查invoke。如果您还没有该Method对象,那么像Class's这样的东西getMethod将对您有用。

Method关于、ModifierClass的文档


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

于 2013-08-27T20:53:40.430 回答