56

andReturn(T value)使用vsandStubReturn(T value)用于 EasyMock有什么区别?

在什么情况下你会使用andStubReturn()whereandReturn()不能达到相同的结果?

4

2 回答 2

58

您将存根返回用于您期望发生但不感兴趣的模拟上的方法调用。您将常规返回用于“常规”方法调用。

考虑以下方法:

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 配置,您的测试不会中断。

于 2010-09-20T21:21:41.670 回答
6

为了清楚起见,附加说明。

如果您使用 .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);
于 2015-03-13T20:07:58.480 回答