andReturn(T value)
使用vsandStubReturn(T value)
用于 EasyMock有什么区别?
在什么情况下你会使用andStubReturn()
whereandReturn()
不能达到相同的结果?
andReturn(T value)
使用vsandStubReturn(T value)
用于 EasyMock有什么区别?
在什么情况下你会使用andStubReturn()
whereandReturn()
不能达到相同的结果?
您将存根返回用于您期望发生但不感兴趣的模拟上的方法调用。您将常规返回用于“常规”方法调用。
考虑以下方法:
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()
调用 togetName()
并使用普通andReturn()
调用postMessage(String)
. 当您验证模拟对象时,它只会考虑后者,并且如果您更改 log4j 配置,您的测试不会中断。
为了清楚起见,附加说明。
如果您使用 .andStubReturn()(或者如果您使用 .andReturn(foo).anyTimes()),则不会有最低预期调用次数。因此,如果您使用这两者中的任何一个设置模拟期望,并且未调用模拟方法,则 .verify() 调用将不会断言。
未调用模拟方法时不会断言的示例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
未调用模拟方法时将断言的示例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);