2010-09-18 2 views
49

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

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

ответ

52

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

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

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

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

+8

так что дайте мне посмотреть, правильно ли я это понимаю. В основном andStubReturn() используется для методов, которые нам не нужны для нашего теста для макетных объектов, но мы должны издеваться над обратным в противном случае, код не будет работать. Методы andStubReturn() не проверены EasyMock; тогда как методыRemurn() проверяются. – Glide

+1

Это правильно. – Barend

+0

Привет, будет ли то же самое использовать andReturn() с дополнительным expectLastCall(). AnyTimes()? – damluar

5

Дополнительное примечание для наглядности.

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

Пример, который будет NOT утверждать, когда метод издевательства не вызывается;

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

EasyMock.verify(myFooClass); 

Пример, что ВОЛЯ утверждают, когда издевались метод не вызывается;

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

EasyMock.verify(myFooClass); 
Смежные вопросы