对EasyMock使用andReturn(T value)
与andStubReturn(T value)
有什么区别?
在什么情况下你会使用andStubReturn()
,其中andReturn()
无法达到相同的结果?
答案 0 :(得分:56)
您在模拟上使用存根返回来进行方法调用,您希望发生这种情况,但不会对其感兴趣。您可以使用常规返回进行“常规”方法调用。
考虑以下方法:
public void someMethod(String arg) {
if (logger.isDebugEnabled()) {
logger.debug("Calling doSomething() on service "
+ service.getName().hashCode());
}
service.postMessage("{" + arg + "}");
if (logger.isDebugEnabled()) {
logger.info("Finished calling doSomething() on service "
+ service.getName().hashCode());
}
}
...其中service
是一个可模拟的字段。日志语句中的hashCode()
是设计的,但重点是你的模拟需要响应getName()
的任意数量的调用来避免NPE,而你不能轻视它
为此方法编写基于EasyMock的单元测试时,您andStubReturn()
拨打getName()
,并使用普通andReturn()
来调用postMessage(String)
。验证模拟对象时,它只考虑后者,如果更改log4j配置,测试不会中断。
答案 1 :(得分:5)
为清晰起见,另外注意。
如果使用.andStubReturn()(或者如果使用.andReturn(foo).anyTimes()),则不会有最小预期呼叫计数。因此,如果您使用这两个中的任何一个设置模拟期望,并且未调用模拟方法,则.verify()调用将不会断言。
在未调用模拟方法时 NOT 断言的示例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
示例 WILL 在未调用模拟方法时断言;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);