EasyMock andReturn()vs andStubReturn()

EasyMock的使用和andReturn(T value) andStubReturn(T value)之间有什么区别?

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

您使用存根返回来模拟您希望发生,但没有其他感兴趣的方法调用。您使用常规的方法调用返回。

考虑以下方法:

 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的unit testing时,你需要和andStubReturn()调用getName()并使用普通的和andReturn()来调用postMessage(String) 。 当你validation模拟对象,它只会考虑后者,如果你改变log4jconfiguration你的testing不会中断。

附加说明清晰。

如果使用.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);