EasyMock andReturn () vs andStubReturn()

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

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

2 ответов


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

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

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 поле из. The hashCode() вещь в операторах журнала надумана, но дело в том, что ваш макет должен отвечать на любое количество вызовов getName() чтобы избежать NPE, в то время как вы не могли иначе заботиться меньше о он.

при написании модульного теста на основе EasyMock для этого метода вы бы andStubReturn() вызов getName() и использовать обычный andReturn() для вызова postMessage(String). Когда вы проверяете макет объекта, он будет рассматривать только последний, и ваш тест не сломается, если вы измените конфигурацию log4j.


дополнительно для ясности.

Если вы используете .andStubReturn () (или если вы используете .andReturn(ФОО).anyTimes ()) не будет минимального ожидаемого количества звонков. Поэтому, если вы устанавливаете ложное ожидание, используя любой из этих двух, и высмеиваемый метод не вызывается, то .вызов verify () не будет утверждать.

пример, что будет не assert, когда высмеиваемый метод не вызывается;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);

пример будет assert когда издевались метод не называется;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);

EasyMock.verify(myFooClass);