8

EasyMock が予想される (定義された) メソッド呼び出しに対して null を返すという問題があります。

モックされたオブジェクトの作成

mock = EasyMock.createMock(DAO.class);

単体テストでセットアップをモックします。

expect(mock.update(myObj).andReturn(myObjUpdated).once();
replayAll();
service.setDao(mock);
service.processData(myObj);
verifyAll();

processData メソッドは単に呼び出します

MyObject objUpdated = dao.update(myObj);

これは、モックが構築されているインターフェイスです。

public interface DAO {
   public <ENTITY> ENTITY update(ENTITY entity);
}

何が問題を引き起こしているのか、私はかなり混乱しています。「obj」は単体テストで定義したオブジェクトと同じであることを確認しました。私はまた、嘲笑した他の方法でこの問題を経験していません(私が認識しています)。

渡されたオブジェクトに問題がある可能性がありますか?

前もって感謝します。ここで他にどのような情報が役立つかはわかりません。

編集:これはテストクラスです(そして、私の誤解がどこから始まったのかが判明しました)

public class TestMyService extends EasyMockHelper {...}
4

1 に答える 1

12

したがって、私の主な問題は、期待やモック オブジェクトの作成にあるのではないことがわかりました。私のテストが拡張している EasyMockSupport クラスがどのように機能するかについて、根本的な誤解がありました。これはドキュメントでは十分にカバーされていませんが、例をもう少し詳しく調べると、私のエラーが明らかになりました。

EasyMockSupport クラスにより、私のテスト クラスは replayAll()、verifyAll()、および resetAll() などのメソッドにアクセスできます。これらが行うことは、作成された各モック オブジェクトを手動で制御することを心配できるようにすることです。ただし、ドキュメントで言及されていないのは、コントロールを適切に登録できるように、EasyMockSupport クラスによって提供されるメソッドを使用してモック オブジェクトを作成する必要があるということです。((これは完全に理にかなっていますが、私は単にどこでも読んでいませんでした))。APIを調べると、EasyMockSupport クラスは、createMock(Class class) など、EasyMock クラスから通常は静的に使用するすべてのメソッドを子クラスに提供します。

更新されたコードについては

public class TestMyService extends EasyMockSupport {
   private MyService service;
   private MyDao dao;

   private MyObject myObj;

   @Before public void setUp() {
      service = new MyService();

      // THIS IS THE KEY
      mock = createMock(IDao.class); //CORRECT
      // mock = EasyMock.createMock(IDao.class); //WRONG

      service.setDao(mock);
      myObj = new MyObject("expectedData");
   }
   @After public void tearDown() {
      verifyAll();
   }
   @Test public void testMyService() {
      expect(mock.update(myObj)).andReturn(myObj);
      replayAll();
      service.myService(myObj);
   }
}

public class MyService() {
   private IDao dao;
   public void setDao(IDao dao) {this.dao = dao; }
   public MyObject myService(MyObject myObj) {
      return dao.update(myObj);
   }
}
于 2011-01-14T03:29:49.137 に答える