我想知道是否可以在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()」語句,但它使我的測試不可讀,難以維護。
或者我應該切換到另一個測試框架?
也許你的例子太簡單,無法理解這裏的實際問題,但你爲什麼沒有'getName'方法的句柄?你真的不知道在這種情況下可以調用多少次?它真的會不止一次? – mystarrocks 2015-02-13 17:20:10
我的例子確實簡化了,當然我可以計算調用該方法的次數。要點是:我不希望單元測試依賴於添加/更改,甚至啓用/禁用日誌輸出。更一般的:我想從「嚴格」順序中排除一些方法。 – geronimo 2015-02-18 19:20:22