unit testing - replay - EasyMock andReturn()vs andStubReturn()
github easy mock (2)
使用andReturn(T value)
vs和andStubReturn(T value)
對EasyMock有什麼andStubReturn(T value)
?
在什麼情況下你會使用andStubReturn()
,其中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的單元測試時,您將調用andStubReturn()
調用getName()
並使用普通的andReturn()
來調用postMessage(String)
。 驗證模擬對象時,它只考慮後者,如果更改log4j配置,則測試不會中斷。
為清楚起見,另外注意。
如果您使用.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);
在未調用mocked方法時將斷言的示例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);