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