EasyMock:将中间 anyTimes 与严格模拟相结合

EasyMock: combine intermediate anyTimes with strict mock

我想知道是否可以在 easyMock 中定义允许 "intermediate" 方法调用的行为。

假设我想验证 class:

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().

有什么优雅的方法可以解决这个问题吗?现在,我在每个 "real" 期望之前添加了这个 "anyTimes()" 语句,但它使我的测试不可读且难以维护。

或者我应该切换到另一个测试框架?

如果您不关心方法调用,例如日志记录,您可以使用存根将其排除在任何验证之外。所以:

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

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