2015-02-11 30 views
1

我想知道是否可以在easyMock中定義允許「中間」方法調用的行爲。EasyMock:將中間anyTime與嚴格模擬相結合

假設我要驗證doSomething方法在這個類的行爲:

class MyObject { 
    MyOtherObject inner; // init as constructor param... 

    void doSomething() { 
     inner.call1(); 
     inner.call2(); 
    } 

    public String toString() { 
     return "MyObject{" + inner.getName() + "}"; 
    } 
} 

我有這個測試代碼:

MyOtherObject mocked = EasyMock.createStrictMock(MyOtherObject.class); 
MyObject obj = new MyObject(myOtherObject); 

// methods need to be called in this order 
EasyMock.expect(mocked.call1()).once(); 
EasyMock.expect(mocked.call2()).once(); 

obj.doSomething(); 

當我改變的MyObject.doSomething()實施使用添加日誌記錄toString()方法,我的測試失敗,因爲我沒有添加對MyOtherObject.getName()的期望。

由於我需要一個嚴格的模擬(與方法順序檢查),只需添加此將不起作用:EasyMock.expect(mocked.getName()).andReturn("blahblah").anyTimes()

有沒有一種優雅的方式來解決這個問題?現在,我在每個「真實」期望之前添加了這個「anyTimes()」語句,但它使我的測試不可讀,難以維護。

或者我應該切換到另一個測試框架?

+0

也許你的例子太簡單,無法理解這裏的實際問題,但你爲什麼沒有'getName'方法的句柄?你真的不知道在這種情況下可以調用多少次?它真的會不止一次? – mystarrocks 2015-02-13 17:20:10

+0

我的例子確實簡化了,當然我可以計算調用該方法的次數。要點是:我不希望單元測試依賴於添加/更改,甚至啓用/禁用日誌輸出。更一般的:我想從「嚴格」順序中排除一些方法。 – geronimo 2015-02-18 19:20:22

回答

1

如果您不關心方法調用,例如日誌記錄,則可以使用存根將其從任何驗證中排除。所以:

EasyMock.expect(mocked.getName()).andStubReturn("blah"); 

這將防止您的測試通過返回值打破,但不會在任何種類的嘲諷驗證,包括嚴格的模擬排序的因素。

+1

謝謝,我不知道'andStubReturn'方法,這正是我需要的!我也發現這篇文章解釋了該方法和'和返回'之間的區別:http://stackoverflow.com/questions/3740376/easymock-andreturn-vs-andstubreturn – geronimo 2015-12-14 08:55:25