我想知道是否有可能在easyMock中定义允许“中间”方法调用的行为。
假设我要验证此类中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()”语句,但是它使我的测试难以理解并且难以维护。
还是应该切换到另一个测试框架?
最佳答案
如果您不关心方法调用(例如日志记录),则可以使用存根将其从任何验证中排除。所以:
EasyMock.expect(mocked.getName()).andStubReturn("blah");
这将防止您的测试因返回值而中断,但不会考虑任何形式的模拟验证,包括严格的模拟排序。