2

重複の可能性:
Mockito を使用したメソッド呼び出しでオブジェクトをインターセプトする

ある形式から別の形式にマップできるクラスがあります。これはレガシ コードなので、あえて書き直すつもりはありません。基本的にはプラグインのセットなので、1 つを変更すると、他のすべてを変更する必要があるかもしれません。テストを念頭に置いて開発されたものではありません。これは私の問題です。

interface Mapper {
    void handle(ClassA classA);
    void handle(ClassB classB);
}

public interface Publisher {
    public void publish(MappedClass mappedClass);
}

class MyMapper implements Mapper {

    private Publisher publisher;
    public void setPublisher(final Publisher publisher) {
        this.publisher = publisher;
    }

    public handle(ClassA classA) {
        final MappedClass mappedClass = // Map from ClassA to MappedClass
        publisher.publish(mappedClass);
    }

    public handle(ClassB classB) {
        final MappedClass mappedClass = // Map from ClassB to MappedClass
        publisher.publish(mappedClass);
    }
}

わかった。したがって、「処理」MappedClassされたクラスに応じて、さまざまな値で公開されます。これは、検証 (テスト) したい値です。publish問題は、メソッドが呼び出されることをテストするコードを最初に記述しなければならないテストを取得することです。

private boolean wasCalled;

@Test
public void testClassAMapped() {
    wasCalled = false;
    final MyMapper myMapper = new MyMapper();
    myMapper.setPublisher(new Publisher() {
        public void publish(final MappedClass mappedClass) {
            wasCalled = true;
           // Code for verifying the fields in mappedClass
        });
    }
    final ClassA classA = // Create classA
    myMapper.handle(classA);
    assertTrue(wasCalled);
}

したがって、最初にの状態をPublisher最初に設定するモックを作成して、このメソッドが呼び出されたことを確認します (この例は単純化されているため、実際にはコードにディスパッチャーがあります... レガシー コードなので、変更したくありません) )、次に、正しいフィールド値があることを確認したいと思います。私が知りたいのは、これをテストするより良い方法を誰かが知っているかどうかです。、およびチェックは、多くのテストで多かれ少なかれ定型コードになりますが、それほど混乱を招きたくないので(独自のハック、テストベースクラスなど)、方法があるかどうか知りたいですこれはMockito、またはEasyMockですか?wasCalledtrueMappedClasswasCalledwasCalled

4

2 に答える 2

6

Mockito ArgumentCaptorを使用する

@Test
public void test(){
  Publisher publisher = Mockito.mock(Publisher.class);
  myMapper.setPublisher(publisher);
  ArgumentCaptor<MappedClass> captor = ArgumentCaptor.forClass(MappedClass.class);

  ....
  myMapper.handle(...);
  ...

  verify(publisher).publish(captor.capture());
  MappedClass passedValue = captor.getValue();
  // assert stuff here
}
于 2012-09-10T13:31:35.983 に答える
5

問題を完全に理解しているかどうかはわかりませんが、あなたが探しているようですMockito.verify(publisher).publish(Matchers.isA(MappedClass.class));

それが機能するためには、モックPublisherスルー
Publisher publisher = Mockito.mock(Publisher.class)
してからそれをに渡す必要がありMyMapperます。

の状態をアサートする必要がある場合はMappedClass、を使用しArgumentCaptorます。例については、この回答を参照してください。

Mockito -API-docには多くの追加の例があります。

于 2012-09-10T13:17:52.667 に答える