我想知道是否可以在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()"在每个"真实"之前的陈述期望,但它使我的测试难以理解,难以维护。
或者我应该切换到另一个测试框架?
答案 0 :(得分:1)
如果您不关心方法调用,例如日志记录,则可以使用存根将其排除在任何验证之外。所以:
EasyMock.expect(mocked.getName()).andStubReturn("blah");
这会通过返回值来阻止您的测试中断,但不会考虑任何类型的模拟验证,包括严格的模拟排序。