Подтвердить что ты не робот

EasyMock andReturn() vs andStubReturn()

В чем разница между использованием andReturn(T value) vs andStubReturn(T value) для EasyMock?

В какой ситуации вы бы использовали andStubReturn(), где andReturn() не может достичь того же результата?

4b9b3361

Ответ 1

Вы используете возвращаемый ключ для вызова метода в макете, который вы ожидаете, но не интересуетесь другим. Вы используете регулярный возврат для "обычного" вызова метода.

Рассмотрим следующий метод:

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.

Ответ 2

Дополнительная заметка для ясности.

Если вы используете .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);