EasyMock:将中间任何时间与严格的模拟结合起来

时间:2015-02-11 08:38:06

标签: java unit-testing easymock

我想知道是否可以在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()"在每个"真实"之前的陈述期望,但它使我的测试难以理解,难以维护。

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

1 个答案:

答案 0 :(得分:1)

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

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

这会通过返回值来阻止您的测试中断,但不会考虑任何类型的模拟验证,包括严格的模拟排序。