Mockito-разница между doReturn() и when()



в настоящее время я использую Mockito, чтобы издеваться над моими объектами уровня сервиса в приложении Spring MVC, в котором я хочу проверить свои методы контроллера. Однако, поскольку я читал о специфике Mockito, я обнаружил, что методы doReturn(...).when(...) эквивалентно when(...).thenReturn(...). Итак, мой вопрос в том, какой смысл иметь два метода, которые делают одно и то же, или в чем тонкая разница между doReturn(...).when(...) и when(...).thenReturn(...)?



любая помощь будет оценили.

665   6  

6 ответов:

два синтаксиса для stubbing примерно эквивалентны. Тем не менее, вы можете всегда использовать doReturn/when для stubbing; но есть случаи, когда вы не могу использовать when/thenReturn. Одним из таких методов является Stubbing void. Другие включают в себя использование с Mockito шпионов, и стаббинг тот же метод более одного раза.

одно when/thenReturn дает, что doReturn/when не делает, это проверка типа значения, которое вы возвращаете, во время компиляции. Тем не менее, я считаю, что это имеет почти никакого значения - если вы ошиблись в типе, вы узнаете, как только Запустите свой тест.

я настоятельно рекомендую использовать только doReturn/when. Нет смысла изучать два синтаксиса, когда один будет делать.

вы можете обратиться к моему ответу на формирование Mockito "грамматики" - более подробный ответ на очень близкий вопрос.

оба подхода ведут себя по-разному, если вы используете шпионский объект (с аннотацией @Spy) вместо макета (с аннотацией @Mock):

  • when(...) thenReturn(...)делает реальный вызов метода непосредственно перед возвращением указанного значения. Поэтому, если вызываемый метод вызывает исключение, вы должны иметь дело с ним / издеваться над ним и т. д. Конечно, вы все равно получите свой результат (то, что вы определяете в thenReturn(...))

  • doReturn(...) when(...)не вызывает метод Вообще.

пример:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

Mockito javadoc, кажется, говорит, Почему использовать doReturn() вместо when() Используйте doReturn () в тех редких случаях, когда вы не можете использовать Mockito.когда (объект).

остерегайтесь, что Mockito.когда (объект) всегда рекомендуется для тушения потому что это аргумент типобезопасный и более читаемый (особенно когда стаббинг последовательных вызовов).

вот те редкие случаи, когда doReturn() пригодится:

1. когда подглядывают реальные объекты и вызов реальных методов на шпиона приносит сторону эффекты

List list = new LinkedList(); List spy = spy(list);

//невозможно: реальный метод называется так шпион.получить(0) броски IndexOutOfBoundsException (список пока пуст)

when(spy.get(0)).thenReturn("foo");

//вы должны использовать doReturn() для stubbing: doReturn("foo").when(spy).get(0);

2. переопределение предыдущего исключения-stubbing:

when(mock.foo()).thenThrow(new RuntimeException());

//невозможно: исключение-stubbed foo () метод называется так RuntimeException бросается. when(mock.foo()).thenReturn("bar");

//вы должны использовать doReturn () для stubbing:

doReturn("bar").when(mock).foo(); выше сценариев показывает компромисс из элегантного синтаксиса Мокито. Обратите внимание, что сценарии очень редки, хотя. Шпионаж должен быть единичными и переопределение исключение-раскорчевка является очень редко. Не говоря уже о том, что в целом раскорчевка переменная является потенциальный код, который указывает слишком много раскорчевка.

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

пожалуйста, посмотрите, например, здесь: как сделать mock to void методы с mockito

Continueuing ответ, есть еще одно отличие, что если вы хотите, чтобы ваш метод возвращал разные значения, например, когда он вызывается в первый раз, во второй раз и т. д., то вы можете передавать значения так, например...

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

поэтому он вернет false, когда метод вызывается в том же тестовом случае, а затем он снова вернет false и, наконец, true.

"макет"может имитировать объект вместо его создания;" шпион " может создать фактический объект с фактическими параметрами. Когда мы делаем модульный тест,мы часто используем их. Но когда(ХХХ).thenReturn(xxx)' используется для макета и 'doReturn (xxx).когда (xxx) ' используется для шпиона.

Comments

    Ничего не найдено.