6

EasyMockを使用して、モックされたメソッドの可変メソッドパラメータを変更するにはどうすればよいですか?

たとえば、BlockingQueueを使用するクラスがあります。単体テストのためにBlockingQueueメンバーをモックしたいと思います。私のクラスはメソッドqueue.drainTo(Collection c)を呼び出します。このメソッドを呼び出すと、キューから要素が削除され、コレクションに追加されます。EasyMockを使用してこの動作をどのようにモックしますか?例は素晴らしいでしょう。

4

2 に答える 2

13

andAnswergetCurrentArgumentsを使用できます:

public void testDrainToQueue() {
  BlockingQueue<Foo> queue = EasyMock.createMock(BlockingQueue.class);
  EasyMock.expect(queue.drainTo(EasyMock.isA(List.class)))
      .andAnswer(new IAnswer<Integer>() {
        public Integer answer() {
          ((List) EasyMock.getCurrentArguments()[0]).add(new Foo(123));
          return 1; // 1 element drained
        }
      });
  EasyMock.replay(queue);
  ...
}

ヘルパークラスまたはメソッドを抽出すると役立つ場合があります。

private static IAnswer<Integer> fakeDrainReturning(final List drainedElements) {
  return new IAnswer<Integer() {
    @Override public Integer answer() {
      ((List) EasyMock.getCurrentArguments()[0]).addAll(drainedElements);
      return drainedElements.size();
    }
  };
}

次に、次のことができます。

List<Foo> drainedElements = Arrays.asList(new Foo(123), new Foo(42));
EasyMock.expect(queue.drainTo(EasyMock.isA(List.class)))
    .andAnswer(fakeDrainReturning(drainedElements));

実数を使用しBlockingQueueて、キューからデータを削除する予定のメソッドの前に、目的の値をキューに挿入する方法を見つける方がよい場合があります。

于 2010-09-08T08:37:34.137 に答える
0

コードがどのように見えるかを正確に伝えるのは困難です。あなたがテストしたいコードを知っていれば、あなたをよりよく助けることができます..しかし、あなたがテストしたいコードを次のように仮定すると:

private BlockingQueue<String> queue;
private List<String>  myList = new ArrayList<String> ():

private void setBlockingQueue( BlockingQueue<String>  queue ) { 
    this.queue = queue;
}

public List<String> getMyList() {
    return myList;
}

public void setMyList( List<String> myList) {
    this.myList = myList;
}

public void doWork() {
    System.out.println("blah");
    queue.drainTo( myList );
}

テストは

public void testDoWork() {
    List<String> stuffToDrain = new ArrayList<String>();
    stuffToDrain.add( "foo" );
    stuffToDrain.add( "bar" );
    myTestingClass.setMyList( stuffToTrain );


    BlockingQueue<String> queue = EasyMock.createMock( BlockingQueue.class  );
    myTestingClass.setBlockingQueue( queue );
    queue.drainTo( stuffToDrain );
    EasyMock.replay( queue );
    myTestingClass.doWork();
    EasyMock.verify( queue );



}

正しくない場合は申し訳ありませんが、表示できないコードのテストを提案するのは本当に難しいです...

編集 - モックの使用方法が原因で、変更可能なパラメーターが変更されるとは断言できません。できることは、drainTo メソッドが呼び出されることをアサートすることだけです。もしdrainToが私たちがやりたいことをするなら、他の場所でテストする必要があります..つまり、BlockingQueue.classのテストで

編集 2 - メソッドが呼び出されると予想されるリストについて、より具体的にすることができます。

于 2010-08-25T19:36:30.543 に答える