29

一般的な方法でモックのすべてのメソッド呼び出しを傍受することは可能ですか?

次のようなベンダー提供のクラスがあるとします。

public class VendorObject {

    public int someIntMethod() {
        // ...
    }

    public String someStringMethod() {
        // ...
    }

}

すべてのメソッド呼び出しを、一致するメソッド シグネチャがある別のクラスにリダイレクトするモックを作成したいと思います。

public class RedirectedToObject {

    public int someIntMethod() {
        // Accepts re-direct
    }

}

Mockito の when().thenAnswer() コンストラクトは目的に合っているようですが、任意のメソッド呼び出しと任意の引数を一致させる方法が見つかりません。とにかく、InvocationOnMock は確かにこれらすべての詳細を提供してくれます。これを行う一般的な方法はありますか?when(vo.*) を適切なコードに置き換えると、次のようになります。

VendorObject vo = mock(VendorObject.class);
when(vo.anyMethod(anyArgs)).thenAnswer(
    new Answer() {
        @Override
        public Object answer(InvocationOnMock invocation) {

            // 1. Check if method exists on RedirectToObject.
            // 2a. If it does, call the method with the args and return the result.
            // 2b. If it does not, throw an exception to fail the unit test.

        }
    }
);

モックを簡単にするためにベンダー クラスの周りにラッパーを追加することは、次の理由からオプションではありません。

  1. 既存のコード ベースが大きすぎます。
  2. 非常にパフォーマンスが重要なアプリケーションの一部。
4

1 に答える 1

42

あなたが望むのは次のとおりだと思います:

VendorObject vo = mock(VendorObject.class, new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) {

        // 1. Check if method exists on RedirectToObject.
        // 2a. If it does, call the method with the args and return the
        // result.
        // 2b. If it does not, throw an exception to fail the unit test.

    }
});

もちろん、このアプローチを頻繁に使用する場合は、回答を匿名にする必要はありません。

ドキュメントから: 「これは非常に高度な機能であり、通常、まともなテストを作成する必要はありません。ただし、レガシー システムで作業する場合に役立ちます。」あなたのようですね。

于 2012-05-31T22:50:13.143 に答える