2016-12-29 9 views
2

Примечание: Я понимаю, что у шпиона мы можем различаться среди этих двух. Я поехал по всему Интернету, но я все еще сомневаюсь в doreturn/когда и когда/thenreturn в Mockito .Below - мое сомнение,Почему Mock-объект имеет doreturn и thenreturn for mock?

1) Являются ли doreturn/когда и когда/thenreturn действует так же, как для mock-объекта? i.e: не имеет значения, вы вызываете doreturn/when или when/thenreturn для макетного объекта, он не будет вызывать реальный метод, а заостренный вызов. Насколько я понимаю, правильно?

2) doreturn/when и when/thenreturn имеет значение только для объектов-шпионов в Mockito. i.e doreturn/when - не будет называть реальный метод, и когда/thenreturn вызовет реальный метод. Как я понимаю это правильно?

Если мое понимание выше 2 баллов правильное, тогда мы всегда должны использовать doreturn/when, чтобы нам не нужно было изучать синтаксис 2, правильно?

+1

Возможный дубликат [Mockito - разница между doReturn() и когда()] (http://stackoverflow.com/questions/20353846/mockito-difference-between-doreturn-and-when) – troig

+0

его не дублировать, i хотите знать, почему doReturn и когда присутствуют в mock? такие же? –

ответ

2

В Mockito documentation для doReturn() состояний:

Вы можете использовать doThrow(), doAnswer(), doNothing(), doReturn() и doCallRealMethod() вместо соответствующего вызова с тем, когда(), для любой метод. Это необходимо, когда вы

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

, а также ...

Использование doReturn() в тех редких случаях, когда вы не можете использовать, когда (Object).

С примером, приведенным в ...

когда (mock.foo()) thenThrow (новый RuntimeException()).

// Невозможно: метод foo(), исключающий исключение, вызывается так, что выбрано RuntimeException. когда (mock.foo()). ThenReturn ("bar");

// Вы должны использовать doReturn() для обрезания:
doReturn ("bar"). Когда (mock) .foo();

В общем, вы должны использовать when(...).thenReturn(...) синтаксис и случаи, когда синтаксис doReturn(...).when(...) полезен редко. Тем не менее, важно отметить, что шаблон when(...) необходим для издевательских методов пустот, которые не редки. Это всего лишь синтаксис doReturn(...), который реже используется.

Чтобы конкретно ответить на ваши вопросы:

  1. Нет, два Синтаксисы работают немного по-другому - в «doReturn (...) 'позволяет настроить макет объекта для записи поведения до вызывается метод mocked, тогда как синтаксис' when (...) 'работает, выполняя некоторые закулисные jiggery-pokery, чтобы настроить который может работать над методом thenReturn (...) '. Они будут обычно имеют такой же эффект, но различия в реализации становятся очевидными в приведенном выше углу.

  2. Для макета when(...) называет обрезанный метод на макет объекта. Вот почему краевой вопрос выше переопределения поведения заглушек важен.

1

После этого на моем собственном я узнал, что ... 1) doreturn/когда и когда/thenreturn одинаков для издевались object.None их называют фактический метод 2) doreturn/когда и когда/thenreturn имеют другое поведение для объекта-шпионажа. doreturn/when - он не будет называть реальный метод на шпионском объекте когда/thenreturn - он будет называть реальный метод на шпионском объекте

Надеюсь, это поможет!