はインスタンス/コンクリートクラスのメソッド実行時をオーバーライドする方法は? (例えば反射、CGLIB)私がしたい何
- は、クラスX(引数で渡されたクラス変数)と、それの方法のいくつかの
具体的には、親クラスXIをオーバーライドしたいが
- が含まれているデフォルトのコンストラクタ(引数を持つなどすべてのコンストラクタ)が含まれていない
同じクラス内の非プライベートメソッドを呼び出す
- refectionについて:のみjava.lang.reflect.Proxyの CGLIBためhttp://download.oracle.com/javase/1.3/docs/guide/reflection/proxy.html
- を経由して「インターフェース」を上書きすることができます:それはありませんデフォルトコンストラクタのインスタンスを作成することはできませんし、コンストラクタ呼び出し非プライベートメンバメソッド http://insufficientinformation.blogspot.com/2007/12/spring-dynamic-proxies-vs-cglib-proxies.html
Mockitoはあらゆる種類のメソッド注入ランタイムを実行できるので、これは達成可能だと思います。
誰か助言を与えてください、ありがとう。
擬似コードI画像は、次のようである:私はX1.getを呼び出すいくつかの方法を持っているクラスをテストすることを意図した
createAndOverride(Class X) {
X newObj = X.newInstance(args) {
@override
methodOfX(args2) {
...
}
}
return newObj;
}
- 元の問題のシナリオ
()、 X2.get()、X3.get()
いくつかのテストケースでは、私がテスト用に制御できるものを返すためにXn.get()を作成する必要があります(nullなど)
以下の制約のために:
- しかしによるモックツールの制限にJMock 1.0(私は:(制御することはできません)ので、私は単にリターンにXn.getを()モックすることはできません「someSpecifiedObjects」
- Xnのはヌルコンストラクタおよびコンストラクタを持っていません非プライベートメンバー
を呼び出す私の回避策は、自己作らXnのクラスであり、Cn.get()
のコード例が予想されるようにするケースをテストするためにそれらを渡す:
ClassToTest.SomeMethod(new X1() {
@override
get() {
return someSpecifiedObjects;
}
});
を210 そして、このようなことはテストケースに広がっています。
したがって、重複するコードを減らすために、指定されたオーバーライドされたテストメソッドを使用してXnインスタンスを生成するメソッドを作成したいと考えています。例えば
X1 x1 = createAndOverride(X1);
次に、このポストの問題は
メソッドをクラスに「挿入」したいですか? – Kiril
はい、しかし、クラスタイプは実行時に指定する変数です –
私は最終結果が何であるかをもう少し教えてください。おそらく、実行時にメソッドを「注入する」ことなく、あなたがしたいことを達成するためのより簡単な方法があります。 – Kiril