0

私がやりたいのは、

  • クラスX(argで渡されるクラス変数)のインスタンスを生成し、
  • そのメソッドの一部をオーバーライドします

より具体的には、オーバーライドする親クラスXIには次のものが含まれます

  • デフォルトのコンストラクターは含まれていません(たとえば、argsを持つすべてのコンストラクター)
  • 同じクラス内で非プライベートメソッドを呼び出すコンストラクター

もともと、リフレクションなどを使うのはとても簡単だと思っていましたが、要件の実装には限界があることに気づきました。

Mockitoはあらゆる種類のメソッドインジェクションランタイムを実行できるため、これは達成可能だと思います。
誰かアドバイスをお願いします、ありがとう。
私がイメージする擬似コードは次のようなものです。

createAndOverride(Class X) {
    X newObj = X.newInstance(args) {
        @override
        methodOfX(args2) {
            ...
        }
    }
    return newObj;
}
  • 元の問題のシナリオ

X1.get()、X2.get()、X3.get()を呼び出すいくつかのメソッドを持つクラスをテストすることを目的としていました。
テストケースによっては、Xn.get()を作成して制御できるものを返す必要があります。テスト(例:null)
以下の制約のため:

  • ただし、JMock 1.0に対するモックツールの制限により(コントロールがない:()、Xn.get()をモックして「someSpecifiedObjects」を返すことはできません。
  • Xnにはnullコンストラクターと非プライベートメンバーを呼び出すコンストラクターはありません

私の回避策は、自作のXnクラスであり、それらをテストケースに渡して、Cn.get()を期待される
コード例にします。

ClassToTest.SomeMethod(new X1() {
    @override
    get() {
        return someSpecifiedObjects;
    }
});

そして、この種のことはテストケース全体に広がっています。
したがって、重複コードを減らすために、テスト用に指定されたオーバーライドされたメソッドを使用してXnインスタンスを生成するメソッドを構築したいと思います。例えば

X1 x1 = createAndOverride(X1);

次に、この投稿の問題が発生します

4

2 に答える 2

1

javassistのようなものをお探しですか?実行時にコードをインストルメント化してメソッドを挿入できます。私は個人的にバイトコードの操作をできるだけ避けようとしています。その場で行うのではなく、コードベースにこれらのオーバーライドを含めることはできませんか?ラッパーのようなものかもしれませんか?

于 2011-10-29T03:25:49.660 に答える
0

したがって、必要だと思うのは、C#と同様の機能ですReflection.Emit

私自身はこれを行っていませんが、あなたが探しているものを達成するために、反射/放出と動的タイプ作成を使用できるはずだと思います。ただし、テストしている関数のコードパスではない「機能」をテストしようとしている場合は、おそらくまったくテストすべきではないことを述べておきます。例えば:

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

この場合、getにはを返すコードパスがnullないため、をテストする必要はありませんnull。あなたの質問を100%正しく理解したかどうか、特になぜあなたがテストしているのかはわかりませんnullが、上記のアドバイスを検討して、何があなたに役立つかを確認してください。

于 2011-10-30T15:52:57.550 に答える