Как вызвать реальный метод при условии отслеживания объекта в Mockito? - PullRequest
1 голос
/ 15 марта 2019

Мне нужно иметь возможность вызывать реальный метод объекта-шпиона, основываясь на каком-то условии.Т.е. если условие истинно, тогда вызовите реальный метод, в противном случае сделайте что-то еще.

Чтобы было ясно, мне нужно вызвать исключение при первом вызове и вызвать реальный метод при втором вызове.Можно ли добиться этого с помощью Mockito?

Object object = Mockito.spy(new Object());

// On the first call I need to throw an exception like this
Mockito.doThrow(RuntimeException.class).when(object).toString();

// On the second call I need to call a real method
Mockito.doCallRealMethod().when(object).toString();

1 Ответ

2 голосов
/ 15 марта 2019

Легко, используйте when(...).then(...), так как это позволяет "плавно соединять" макет спецификации:

Object object = Mockito.spy(new Object());
Mockito.when(object.toString()).thenThrow(new RuntimeException()).thenReturn("yeha");

try {
  System.out.println(object.toString());
  fail();
} catch(RuntimeException r) {
  System.out.println(object.toString());
}

Отпечатки:

Yeha

Yeha!

Серьезно: вы все равно должны предпочесть when(mock.foo()).then... (см. здесь для списка причин, почему это так). Есть несколько ситуаций, в которых необходимо использовать doReturn().when(), но, как уже было сказано: это ваше последнее средство, а не ваш первый выбор.

...