2011-01-13 24 views
4

予想される(定義された)メソッド呼び出しでEasyMockがnullを返す問題が発生しています。モックオブジェクトユニットテストで設定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 {...} 

答えて

7

だから、それは私の主な問題は、期待して、あるいはの作成にはないことが判明モックオブジェクト。私のテストが機能を拡張しているEasyMockSupportクラスの基本的な誤解がありました。これはドキュメンテーションではうまくカバーされていませんが、例を少し調べるとエラーが明らかになりました。

EasyMockSupportクラスは、私のテストクラスが、replayAll()、verifyAll()、およびresetAll()などのメソッドにアクセスできるようにします。これらの機能を使うと、作成されたそれぞれのモックオブジェクトを手動で制御することを心配することができます。しかし、ドキュメンテーションが言及しなかったのは、EasyMockSupportクラスが提供するメソッドを使用してMockオブジェクトを作成して、コントロールを正しく登録できるようにしなければならないということでした。 (これは全体的な感覚をbtw、私は単にどこでもそれを読んでいなかった))。 APIを調べると、EasyMockSupportクラスは、createMock(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); 
    } 
} 
+0

他の「キー」のためとして

はEasyMockSupportを使用してテストケースクラスを拡張することです。 – d0nut

関連する問題