2017-07-13 32 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) 
    ... 

,如果我不叫驗證,我的Mapper類中第一個電話我Obj結果一個NPE。我是EasyMock的新手,並且還找不到我在initObj中創建的Obj。任何啓發都是值得歡迎的。我對這個主題以及一些簡單的教程閱讀了一些問題,但他們並沒有幫助我

+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'時計算一次呼叫 – 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); 
    } 
}