2013-03-06 167 views
2

我正在爲特定方法編寫junit測試。該方法包含調用DAO類中的其他方法,我正在使用EasyMock進行模擬。正確使用expectLastCall()。一次()在EasyMock

我想斷言這些DAO類方法之一被調用一次,這是我所期望的LastCall()。once()的用途。有問題的方法返回void。

我目前通過的測試中,我只是想確保我的邏輯是正確的,因爲我之前沒有使用過EasyMock。我用這個問題作爲一個參考:EasyMock expectations with void methods

所以,這裏是代碼:

@Before 
    public void setUp() throws Exception{ 
    this.fooService = new FooService(); 
    this.fooMock = createStrictMock(FooDAO.class); 
    } 

    @Test 
    public void test_fooTest(){ 

    String arg1 = "arg1"; 
    String arg2 = "arg2"; 
    this.fooService.setFooDAO(fooMock); 
    expect(this.fooMock.someMethod(arg1, arg2)).andReturn(something); 
    fooMock.methodThatShouldBeCalledOnce(EasyMock.<Object>anyObject()); 
    EasyMock.expectLastCall().once(); 
    replay(this.fooMock); 
    this.fooService.methodUnderTest(someArg, someArg2); 
    verify(this.fooMock); 

    } 

我認爲這樣做是斷言存在於methodThatShouldBeCalledOnce一個電話,它只會發生一次。我並不真正關心某些方法,但是當然EasyMock會抱怨說,如果沒有告訴我們期望它。

謝謝!

回答

1

這對我來說看起來是正確的。您可以輕鬆地通過移除對void方法的調用並驗證測試失敗,或者通過向void方法添加第二個調用並查看測試也失敗來輕鬆進行檢查。

+0

是的,它失敗在這兩個場景中,謝謝。 – user1088166 2013-03-06 14:22:32

1

如果你不關心一些方法,你應該創建一個很好的模擬。那麼,的確沒有必要調用expectLastCall。這是隱含的,但可以是一個很好的做法,讓你明顯地嘲笑一種方法。一次()也不需要,因爲它是默認值。

因此,如果改換,用一個漂亮的米克,消除隱含調用,將靜態導入,並且不添加多餘的「本」,你應該得到:

@Before 
public void setUp() throws Exception{ 
    fooService = new FooService(); 
    fooMock = createNiceMock(FooDAO.class); 
    fooService.setFooDAO(fooMock); 
} 

@Test 
public void test_fooTest(){ 
    fooMock.methodThatShouldBeCalledOnce(anyObject()); 

    replay(fooMock); // or replayAll() if you extend EasyMockSupport 

    fooService.methodUnderTest(someArg, someArg2); 
    verify(fooMock); // or verifyAll() if you extend EasyMockSupport 
}