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()

EasyMock 为预期方法返回 Null

java.lang.IllegalStateException:返回值类型不兼容

嘲弄用 andReturn 返回新对象

EasyMock简单使用方法

easymock的数据为啥必须用get才能获取到,用post就不行?