public Object doSomething(Object o);
私はモックしたいです。パラメータを返すだけです。私は試した:
Capture<Object> copyCaptcher = new Capture<Object>();
expect(mock.doSomething(capture(copyCaptcher)))
.andReturn(copyCatcher.getValue());
しかし、成功せずに、Java.lang.AssertionError: Nothing captured yet
。何か案は?
私は同じ振る舞いを探していて、ついに次のように書きました:
import org.easymock.EasyMock; import org.easymock.IAnswer; /** *キャプチャされた引数に応答できるようにします期待に応えます。 *たとえば、Factoryインターフェースは以下を定義します * <pre> * CharSequence encode(final CharSequence data); * </ pre> *テスト目的では、このメソッドを実装する必要がないため、モックする必要があります。 * <pre> * final Factory factory = mocks.createMock ( "factory"、Factory.class); * final ArgumentAnswer <CharSequence> parrot = new ArgumentAnswer <CharSequence>(); * EasyMock.expect(factory.encode(EasyMock.capture(new Capture <CharSequence>())))およびAnswer(parrot).anyTimes(); * </ pre> * 2010年6月22日に作成。 * @author Remi Fouilloux * */ public class ArgumentAnswer <T>はIAnswer <T> { private final int argumentOffset; [.____。を実装します。 ] public ArgumentAnswer(){ t his(0); } public ArgumentAnswer(int offset){ this.argumentOffset = offset; } /** * {@inheritDoc} */ @SuppressWarnings( "unchecked") public T answer()throws Throwable { final Object [] args = EasyMock.getCurrentArguments(); if(args.length <(argumentOffset + 1)){ throw new IllegalArgumentException( "引数はありませんオフセット "+ argumentOffset); } return(T)args [argumentOffset]; } }
クラスのjavadocに簡単な「ハウツー」を書きました。
お役に立てれば。
まあ、最も簡単な方法は、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)
これは、コンテキスト情報に依存することなく、おそらく最も正確な方法です。これはいつも私にとってはトリックです。
キャプチャは、モックに後で渡される値をテストするためのものです。パラメータ(またはパラメータから計算された値)を返すモックのみが必要な場合は、IAnswerを実装するだけです。
再利用可能な方法でパラメータXを戻す方法が必要な場合は、「Remi Fouilloux」の実装を参照してください。ただし、例でのCaptureの使用は無視してください。
「does_the_trick」の例のようにインライン化したいだけの場合も、Captureはここの赤いニシンです。簡略版は次のとおりです。
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)
@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]);
ええと、私があなたの質問を正しく理解していれば、あなたはそれを複雑にし過ぎているのではないかと思います。
Object someObject = .... ;
expect(mock.doSomething(someObject)).andReturn(someObject);
うまく動作するはずです。期待されるパラメーターと戻り値の両方を指定していることを思い出してください。したがって、両方の作品で同じオブジェクトを使用します。