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