В чем разница между использованием andReturn(T value)
vs andStubReturn(T value)
для EasyMock?
В какой ситуации вы бы использовали andStubReturn()
, где andReturn()
не может достичь того же результата?
В чем разница между использованием andReturn(T value)
vs andStubReturn(T value)
для EasyMock?
В какой ситуации вы бы использовали 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, в то время как вы не могли иначе заботиться об этом.
При написании метода unit test на основе EasyMock для этого метода вы должны andStubReturn()
вызвать getName()
и использовать обычный andReturn()
для вызова postMessage(String)
. Когда вы проверяете макет объекта, он будет рассматривать только последний, и ваш тест не прерывается, если вы измените конфигурацию log4j.
Дополнительная заметка для ясности.
Если вы используете .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);
Предположим, что WILL утверждают, когда метод издевательства не вызывается;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);