EasyMock andReturn()vs andStubReturn()

时间:2010-09-18 04:23:05

标签: unit-testing easymock

对EasyMock使用andReturn(T value)andStubReturn(T value)有什么区别?

在什么情况下你会使用andStubReturn(),其中andReturn()无法达到相同的结果?

2 个答案:

答案 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);