1

EasyMockFoo.doSomething(String arg):Stringを使用してメソッドをテストしたいとします。EasyMock Captureを使用して、パラメーター内に設定された値をキャプチャし、後で取得できることを知っています。テストを作成するときの目標は、Fooのメソッドをモックアウトしたときに値をキャプチャし、モックしたメソッドの外部でキャプチャの値を取得することです。私はこのようなことを試みています:

Capture<String> stringCapture = new Capture<String>();
EasyMock.expect(foo.doSomething(EasyMock.capture(stringCapture)).andAnswer(new IAnswer<String> {
    @Override
    public String answer() throws Throwable {
        ...
});
String retrievedValue = stringCapture.getValue();

ただし、使用しようとするとランタイムエラーが発生しますgetValue()

java.lang.AssertionError: Nothing captured yet
    at org.easymock.Capture.getValue(Capture.java:80)
    at com.example.Test.myTest(...)
    ....

Stringテストメソッド内であるがIAsnwerクロージャーの外側に変数を持ち、その変数の値をメソッド内に設定できればいいのにと思いIAnswer.answer()ます。問題は、クロージャーにアクセスできるようにするためにString変数をとしてマークする必要があることです。これにより、変数は変更できなくなり、使用できなくなります。finalまた、これを解決するためだけにグローバルを使用したくありません。

私が考えた唯一の回避策は、Stringフィールドを持つ独自のクラスを使用し、それをのfinal外部の変数として宣言しIAnswer、キャプチャされた値を中answer()に設定し、最後にこの値をテストメソッド内のフィールドに設定することです。別のクラスを使用してキャプチャされた値、またはグローバル変数を抽出することは私には醜いように思われるため、おそらくこれを行うためのより良い方法があります。

4

1 に答える 1

2

getValueは、fooへの実際の(再生された)呼び出しの後でのみ機能します。その前は、何もキャプチャされていません。

answer()内で変数を設定するには、内部クラスで使用される変数をfinalにするようにJavaが要求するため、通常はAtomicReferenceを使用します。それはそのようなもののための素晴らしいプレースホルダーです。AtomicReferenceは最終的なものですが、その内容は最終的なものではありません。

于 2012-12-25T16:06:24.917 に答える