Java EasyMock:将中间任意时间与严格模拟相结合
我想知道是否有可能在easyMock中定义允许“中间”方法调用的行为 假设我想验证此类中Java EasyMock:将中间任意时间与严格模拟相结合,java,unit-testing,easymock,Java,Unit Testing,Easymock,我想知道是否有可能在easyMock中定义允许“中间”方法调用的行为 假设我想验证此类中doSomething方法的行为: class MyObject { MyOtherObject inner; // init as constructor param... void doSomething() { inner.call1(); inner.call2(); } public String toString() {
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();
当我使用toString()
方法将MyObject.doSomething()
的实现更改为添加日志记录时,我的测试失败,因为我没有添加对MyOtherObject.getName()
的期望
因为我需要一个严格的mock(带有方法顺序检查),所以简单地添加它是行不通的:EasyMock.expect(mock.getName()).andReturn(“blahblah”).anyTimes()
有没有一个优雅的方法来解决这个问题?现在,我已经在每个“真实”的期望之前添加了这个“anyTimes()”语句,但是它使我的测试不可读并且难以维护
或者我应该切换到另一个测试框架吗?如果您不关心方法调用,例如日志记录,您可以使用存根将其从任何验证中排除。因此:
EasyMock.expect(mocked.getName()).andStubReturn("blah");
这将通过返回值防止测试中断,但不会考虑任何类型的模拟验证,包括严格的模拟顺序。也许您的示例太简单,无法理解此处的实际问题,但为什么您没有
getName
方法的句柄?你真的不知道在这个上下文中它可以被调用多少次吗?它真的会不止一次吗?我的例子确实简化了,当然我可以计算该方法被调用的次数。要点是:我不希望单元测试依赖于添加/更改甚至启用/禁用日志输出。更一般:我想从“严格”顺序中排除一些方法。谢谢,我不知道和stubreturn
方法,这正是我需要的!我还发现这篇文章解释了该方法与andReturn的区别: