Я хочу использовать Mockito для тестирования (упрощенного) кода ниже. Я не знаю, как сказать Мокито, что он потерпел неудачу в первый раз, а затем преуспел во второй раз.
for(int i = 1; i < 3; i++) {
String ret = myMock.doTheCall();
if("Success".equals(ret)) {
log.write("success");
} else if ( i < 3 ) {
log.write("failed, but I'll try again. attempt: " + i);
} else {
throw new FailedThreeTimesException();
}
}
Я могу настроить тест успеха с помощью:
Mockito.when(myMock).doTheCall().thenReturn("Success");
И тест на отказ:
Mockito.when(myMock).doTheCall().thenReturn("you failed");
Но как я могу проверить, что если он потерпит неудачу один (или два) раза, то все будет хорошо?
doThrow(new RuntimeException()).doNothing().when(myMock).doTheCall();
Самый короткий способ написать то, что вы хотите, - это
Когда вы предоставляете несколько аргументов,
thenReturn
как это, каждый аргумент будет использоваться не более одного раза, за исключением самого последнего аргумента, который используется столько раз, сколько необходимо. Например, в этом случае, если вы сделаете звонок 4 раза, вы получите «Успех», «Вы потерпели неудачу», «Вы потерпели неудачу», «Вы потерпели неудачу».источник
Поскольку комментарий, касающийся этого, трудно читать, я добавлю отформатированный ответ.
Если вы пытаетесь сделать это с помощью
void
функции, которая просто генерирует исключение, за которым следует шаг отсутствия поведения, вы должны сделать что-то вроде этого:источник
Чтобы добавить к этому и этому ответу, вы также можете использовать цикл для цепочки фиктивных вызовов. Это полезно, если вам нужно смоделировать одно и то же несколько раз или смоделировать какой-то шаблон.
Например (хотя и надуманный):
источник
У меня другая ситуация, я хотел смоделировать
void
функцию для первого вызова и запустить ее нормально при втором вызове.Это работает для меня:
источник