32

public Object doSomething(Object o);嘲笑したいもの。パラメータを返すだけです。私は試した:

Capture<Object> copyCaptcher = new Capture<Object>();
expect(mock.doSomething(capture(copyCaptcher)))
        .andReturn(copyCatcher.getValue());

しかし、成功しなければ、 AssertionError がjava.lang.AssertionError: Nothing captured yet. 何か案は?

4

5 に答える 5

29

ええと、最も簡単な方法は、IAnswer実装でCaptureを使用することです...これをインラインで行うときはfinal、もちろん宣言する必要があります。

MyService mock = createMock(MyService.class);

final Capture<ParamAndReturnType> myCapture = new Capture<ParamAndReturnType>();
expect(mock.someMethod(capture(myCapture))).andAnswer(
    new IAnswer<ParamAndReturnType>() {
        @Override
        public ParamAndReturnType answer() throws Throwable {
            return myCapture.getValue();
        }
    }
);
replay(mock)

これは、コンテキスト情報に依存することなく、おそらく最も正確な方法です。これは私にとって毎回トリックを行います。

于 2011-10-17T16:41:16.893 に答える
19

私は同じ動作を探していましたが、最終的に次のように書きました:

org.easymock.EasyMock をインポートします。
org.easymock.IAnswer をインポートします。

/**
 * Captured 引数が Expectation に応答できるようにします。
 * 例えば、Factory インターフェースは以下を定義します
 * <プレ>
 * CharSequence エンコード (最終的な CharSequence データ);
 * </プレ>
 * テスト目的では、このメソッドを実装する必要がないため、モックする必要があります。
 * <プレ>
 * 最終的な Factory factory = mocks.createMock("factory", Factory.class);
 * 最終 ArgumentAnswer<CharSequence> オウム = 新しい ArgumentAnswer<CharSequence>();
 * EasyMock.expect(factory.encode(EasyMock.capture(new Capture<CharSequence>()))).andAnswer(オウム).anyTimes();
 * </プレ>
 ※2010年6月22日作成。
 * @作者 レミ・フイユ
 *
 */
public class ArgumentAnswer<T> は IAnswer<T> を実装します {

    private final int argumentOffset;

    public ArgumentAnswer() {
        これ(0);
    }

    public ArgumentAnswer(int オフセット) {
        this.argumentOffset = オフセット;
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("未チェック")
    public T answer() throws Throwable {
        最終オブジェクト[] args = EasyMock.getCurrentArguments();
        if (args.length < (argumentOffset + 1)) {
            throw new IllegalArgumentException("オフセットに引数がありません" + argumentOffset);
        }
        return (T) args[argumentOffset];
    }

}

クラスの javadoc に簡単な「ハウツー」を書きました。

お役に立てれば。

于 2010-06-22T10:34:27.407 に答える
17

キャプチャは、後でモックに渡される値をテストするためのものです。パラメータ(またはパラメータから計算された値)を返すためにモックのみが必要な場合は、IAnswerを実装するだけです。

パラメータXを戻す再利用可能な方法が必要な場合は、「Remi Fouilloux」の実装を参照してください。ただし、例でのキャプチャの使用は無視してください。

「does_the_trick」の例のようにインライン化したい場合も、ここでもキャプチャは赤いニシンです。簡略化されたバージョンは次のとおりです。

MyService mock = createMock(MyService.class);
expect(mock.someMethod(anyObject(), anyObject()).andAnswer(
    new IAnswer<ReturnType>() {
        @Override
        public ReturnType answer() throws Throwable {
            // you could do work here to return something different if you needed.
            return (ReturnType) EasyMock.getCurrentArguments()[0]; 
        }
    }
);
replay(mock)
于 2012-01-17T20:22:17.920 に答える
9

@does_the_trick に基づいてラムダを使用すると、次のように記述できるようになりました。

MyService mock = EasyMock.createMock(MyService.class);

final Capture<ParamAndReturnType> myCapture = EasyMock.newCapture();
expect(mock.someMethod(capture(myCapture))).andAnswer(() -> myCapture.getValue());

または@thetoolmanが提案したようにキャプチャなし

expect(mock.someMethod(capture(myCapture)))
.andAnswer(() -> (ParamAndReturnType)EasyMock.getCurrentArguments()[0]);
于 2015-01-16T21:38:17.990 に答える
2

ええと、私があなたの質問を正しく理解していれば、あなたはそれを複雑にしすぎているのではないかと思います。

Object someObject = .... ;
expect(mock.doSomething(someObject)).andReturn(someObject);

正常に動作するはずです。期待されるパラメーターと戻り値の両方を指定していることを忘れないでください。したがって、両方の作業で同じオブジェクトを使用します。

于 2010-04-19T12:14:51.170 に答える