EasyMock andReturn() 与 andStubReturn()
Posted
技术标签:
【中文标题】EasyMock andReturn() 与 andStubReturn()【英文标题】:EasyMock andReturn() vs andStubReturn() 【发布时间】:2011-04-14 00:18:45 【问题描述】:在 EasyMock 中使用 andReturn(T value)
与 andStubReturn(T value)
有什么区别?
在什么情况下你会使用andStubReturn()
而andReturn()
不能达到相同的结果?
【问题讨论】:
【参考方案1】:您将存根返回用于您期望发生但不感兴趣的模拟上的方法调用。您将常规返回用于“常规”方法调用。
考虑以下方法:
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 配置,您的测试不会中断。
【讨论】:
所以让我看看我是否理解正确。基本上 andStubReturn() 用于我们不关心模拟对象测试的方法,但我们需要模拟返回,否则代码将无法运行。 andStubReturn() 方法未经 EasyMock 验证;而 andReturn() 方法已经过验证。 您好,andReturn() 和附加的expectLastCall().anyTimes() 会一样吗? 不,不一样。 [Anytimes] 允许在模拟对象上多次调用该方法,但是所有此类调用都将得到验证。 IE。如果任何调用不使用模拟对象方法,则结果将失败。 @damluar:andStubReturn()
设置默认返回值,仅当常规 .andReturn()
用完时才用作后备。 EasyMock 维护者的示例:tech.groups.yahoo.com/group/easymock/message/1069【参考方案2】:
为清楚起见附加说明。
如果您使用 .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);
WILL 在未调用模拟方法时断言的示例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
【讨论】:
以上是关于EasyMock andReturn() 与 andStubReturn()的主要内容,如果未能解决你的问题,请参考以下文章
什么是 Mockito 等价于 expect().andReturn().times()