2011-10-29 3 views
0

インスタンス/コンクリートクラスのメソッド実行時をオーバーライドする方法は? (例えば反射、CGLIB)私がしたい何

  • は、クラスX(引数で渡されたクラス変数)と、それの方法のいくつかの
  • オーバーライドのインスタンスを生成することができる方法であります

    具体的には、親クラスXIをオーバーライドしたいが

    • が含まれているデフォルトのコンストラクタ(引数を持つなどすべてのコンストラクタ)が含まれていない

    同じクラス内の非プライベートメソッドを呼び出す

  • コンストラクタはもともと私はその後、私は私の要件を実装するには限界があります見つけ 、それが反射または類似のものを使用することは非常に簡単だと思いました。

    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); 
    

    次に、このポストの問題は

  • +0

    メソッドをクラスに「挿入」したいですか? – Kiril

    +0

    はい、しかし、クラスタイプは実行時に指定する変数です –

    +0

    私は最終結果が何であるかをもう少し教えてください。おそらく、実行時にメソッドを「注入する」ことなく、あなたがしたいことを達成するためのより簡単な方法があります。 – Kiril

    答えて

    0

    だから私はあなたが必要だと思うものをC#のReflection.Emitと同様の機能である:

    私は自分自身をこれを行っていないが、私は思いますあなたはあなたが探しているものを達成するためにリフレクション/エミッションとダイナミックタイプの作成を使用できるはずです。しかし、私はまだあなたがテストしている関数のコードパスをintではない "機能"をテストしようとしているなら、おそらくそれをテストするべきではないと言いたいと思います。例:この場合

    SomeObjectInterface get() 
    { 
        if(_someObjectStateIsSet) 
        { 
         // Return a concrete implementation A 
         return new ConcreteImplA(); 
        } 
        else 
        { 
         // Return a concrete implementation B 
         return new ConcreteImplB(); 
        } 
    } 
    

    あなたはnullをテストする必要はありませんので、nullを返す何もコードパスを持っていません取得します。私はあなたの質問を100%正確に理解しているかどうかわからない、特にnullのテストをしている理由は分かっていますが、上記のアドバイスを検討し、何が効果的かを見てください。

    +0

    あなたの提案をお寄せいただき、ありがとうございます。たぶん私ははっきりと述べていないが、nullはif(Xn.get()== null){...}と書かれているClass-under-testのコードパスだけである。 :) –

    +0

    @ジム、大丈夫なので、発光機能はあなたが望むことをするのに十分ではないでしょうか? – Kiril

    1

    あなたがjavassistのようなものを探していていますか?実行時にコードを計測し、メソッドを注入することができます。私は個人的に可能な限りバイトコード操作を避けようとしています。実行中ではなく、コードベースでこれらのオーバーライドを使用できますか?ラッパーのようなものかもしれない?

    関連する問題