EasyMock andReturn()vs andStubReturn()

Gli*_*ide 54 unit-testing easymock

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

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

Bar*_*end 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

......哪里service是一个可模仿的领域.该hashCode()日志报表的事情是做作,但问题是,你的模拟需要到任意数量的呼叫响应getName(),以避免NPE,而你不能,否则不太关心它.

在为此方法编写基于EasyMock的单元测试时,您可以andStubReturn()拨打电话getName()并使用正常andReturn()呼叫postMessage(String).验证模拟对象时,它只会考虑后者,如果更改log4j配置,则测试不会中断.

  • 所以,让我看看我是否正确理解这一点.基本上,andStubReturn()用于我们不关心模拟对象测试的方法,但是我们需要模拟返回,否则代码将无法运行.EasyMock不验证andStubReturn()方法; 而且验证了andReturn()方法. (11认同)
  • @damluar:`andStubReturn()`设置一个默认的返回值,只有在常规`.andReturn()`用完后才用作后备.EasyMock维护者的示例:http://tech.groups.yahoo.com/group/easymock/message/1069 (6认同)

小智 5

附加说明为清晰起见.

如果您使用.andStubReturn()(或者如果您使用.andReturn(foo).anyTimes()),则不会有最小预期呼叫计数.因此,如果使用这两个中的任何一个设置模拟期望,并且未调用模拟方法,则.verify()调用将不会断言.

不调用mocked方法时不会断言的示例;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);
Run Code Online (Sandbox Code Playgroud)

在未调用mocked方法时断言的示例;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);
Run Code Online (Sandbox Code Playgroud)