2017-07-13 17 views
2

私は現在、EasyMockを使用するいくつかのテストケースに取り組んでいます。私の例のコードは次のようになります。EasyMockがnullを返す

{ 
    dao = EasyMock.createNiceMock(Dao.class); 

    initObj(); 
    EasyMock.replay(dao); 
    // EasyMock.verify(dao); 

    mapper = new Mapper(); 
    mapper.setDao(dao); 
} 
@Test 
public void testmapper(){ 
    mapper.map(); 
} 

public void initObj() { 
    Obj o = new Obj(); 
    o.setX(2); 
    EasyMock.expect(dao.findObj(1)).andReturn(o); 
} 

class Mapper { 
    @Autowired 
    private Dao dao; 

    public Obj map(){ 
     Obj o = dao.findObj(1); 
     System.out.println(o.getX()); 
     return o; 
    } 
    //getter and setter 
} 

私は実際にEasyMock.verify(dao);を呼び出す場合、それは

java.lang.AssertionError: 
    Expectation failure on verify: 
    dao.findObj(1): expected: 1, actual: 0 
    at org.easymock.internal.MocksControl.verify(MocksControl.java:183) 
    at org.easymock.EasyMock.verify(EasyMock.java:2142) 
    ... 

をスローし、私は私のObj結果にMapperクラス内の私の最初の呼び出し、検証呼び出していない場合NPE。私はEasyMockを非常に新しくしていて、initObjで作成したObjを返さない理由をまだ見つけることができませんでした。どんな啓発も大歓迎です。私はSOに関するいくつかの簡単なチュートリアルだけでなく、このトピックにも読むが、助けにはならなかった。

+0

「Obj#findObj」の署名とは何ですか?それは「整数」ですか? (最初のn個のIntegerインスタンスがキャッシュされているので問題はありませんが、誰が知っていますか?) –

+0

'Obj#findObj'はデータベースからカスタムオブジェクトを配信します。 @khelwoodなぜなら、最初に私のコードで確認の呼び出しを持っていなかったからです。 – XtremeBaumer

+0

質問は戻り値の型ではなく、引数の型に... –

答えて

0

私の問題の解決策が見つかりました。私のinitObj()方法では、私はまた、このような正常な動作のための呼び出しの数を定義する必要があります。

public void initObj() { 
    Obj o = new Obj(); 
    o.setX(2); 
    EasyMock.expect(dao.findObj(1)).andReturn(o).times(1); 
} 

私はまだ、まだそれがtimes(1)ずに働くことができる方法を理解していないもの。単純に使用する同僚のサンプルコードがありますEasyMock.expect(dao.findObj(1)).andReturn(o);

+0

いいえ 'times(1)'を指定する必要はありません。デフォルトでは、EasyMockは 'andReturn'を呼び出すときに1つの呼び出しをカウントします。 – Henri

+0

@Henri私の正確な問題は、すべてのテストの前ではなく、一度だけ呼び出されると思ったので、' @ Before'と '@ After'という注釈を誤解しました。すべてのテストで '@ Before'で呼び出されたすべてのメソッドが期待どおりに指定されていなかったため、' EasyMock.verify(dao);も失敗しました。しかし、私は今コードを作業し、私のミスから学んだ – XtremeBaumer

1

verifyは、テストの後でなければなりません。だからmapper.map()の後。すべての期待されるコールが行われたことを確認するために使用されます。だからそれは終わりに起こるのが理にかなっている。

あなたが提供しているコードでNPEを取得することは絶対不可能です。 getXとsetXに問題がない限り。ここにあなたのコードの私のバージョンです。それは完全に動作します。

public class MyTest { 

    private final Dao dao; 
    private final Mapper mapper; 

    { 
     dao = EasyMock.createNiceMock(Dao.class); 

     initObj(); 
     EasyMock.replay(dao); 
     // EasyMock.verify(dao); 

     mapper = new Mapper(); 
     mapper.setDao(dao); 
    } 

    @Test 
    public void testmapper(){ 
     mapper.map(); 
     EasyMock.verify(dao); 
    } 

    public void initObj() { 
     Obj o = new Obj(); 
     o.setX(2); 
     EasyMock.expect(dao.findObj(1)).andReturn(o); 
    } 

    class Mapper { 
     private Dao dao; 

     public Obj map(){ 
      Obj o = dao.findObj(1); 
      System.out.println(o.getX()); 
      return o; 
     } 

     public void setDao(Dao dao) { 
      this.dao = dao; 
     } 
    } 

    class Obj { 
     private int x; 

     public int getX() { 
      return x; 
     } 

     public void setX(int x) { 
      this.x = x; 
     } 
    } 

    interface Dao { 
     Obj findObj(int i); 
    } 
}