web-dev-qa-db-ja.com

パラメーターの1つを返すイージーモックでメソッドをモックするにはどうすればよいですか?

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。何か案は?

30
Jan

私は同じ振る舞いを探していて、ついに次のように書きました:

 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に簡単な「ハウツー」を書きました。

お役に立てれば。

18
rems

まあ、最も簡単な方法は、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)

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

26
does_the_trick

キャプチャは、モックに後で渡される値をテストするためのものです。パラメータ(またはパラメータから計算された値)を返すモックのみが必要な場合は、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)
15
thetoolman

@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]);
9
Marco Baumeler

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

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

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

2
drekka