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