unit testing - replay - EasyMock andReturn()vs andStubReturn()




github easy mock (2)

您可以在模擬上使用存根返回來進行方法調用,而這種方法調用是您希望發生但不感興趣的。您使用常規返回進行“常規”方法調用。

考慮以下方法:

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配置,則測試不會中斷。

使用andReturn(T value) vs和andStubReturn(T value)對EasyMock有什麼andStubReturn(T value)

在什麼情況下你會使用andStubReturn() ,其中andReturn()不能達到相同的結果?


為清楚起見,另外注意。

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