我想知道是否有可能在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");


这将防止您的测试因返回值而中断,但不会考虑任何形式的模拟验证,包括严格的模拟排序。

07-24 09:25