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. JVM に既にあるシングルトンに対してメソッドの実行を確認し、runmethod を呼び出すために (以下のコードで行っているように) 新しいインスタンスを作成したくありませんmm.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);に を使用して、これを続行するにはこのアプローチがあまりにも間違っていると判断しました。テストでテストしているものを変更しました。内部のネストされたクラスのインスタンスを導入しましたが、メソッドが表示されない理由は、含まれているクラスのネストされた性質、コンストラクター、および Java の動作の 1 つまたはすべてに関係している可能性があると想定しています。 /インスタンスの構築が成功するまでインスタンスメソッドを表示しないという決定。なぜできなかったのか、確かに知りたいです。getDeclaredMethods()getMethods()run

4

1 に答える 1

3

実行時に非静的メソッドを呼び出そうとしているかどうかを知りたいと言ったので、この少しのリフレクションが役立つはずです。

がメソッドに対応するインスタンスmであると仮定すると、メソッドが静的である場合にのみ true が返されるため、実際に を呼び出す前にこのチェックを行うことができます。オブジェクトをまだ持っていない場合は、のようなものが役に立ちます。MethodModifier.isStatic(m.getModifiers())invokeMethodClassgetMethod

MethodModifier、およびに関するドキュメントClass


編集:上記のすべては、メソッドを経由して呼び出す前にメソッドが静的かどうかを確認するのに役立ちますinvoke。jmockit のようなものを使用して、そのようなメソッドが呼び出されたことを確認できるようにしたい場合はIllegalArgumentException、特にそれがスローされている場合に、それがどのように役立つかを個人的に考えてinvoke ます。例外メッセージが示すことをしようとすることは許可されていません。あなたがそれを嘲笑することができたとしても、それはより深い問題をカバーしている可能性があります.

于 2013-08-27T20:53:40.430 に答える