Chcę użyć Mockito do przetestowania (uproszczonego) kodu poniżej. Nie wiem, jak powiedzieć Mockito, żeby za pierwszym razem zawiódł, a za drugim odniósł sukces.
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();
}
}
Mogę skonfigurować test sukcesu za pomocą:
Mockito.when(myMock).doTheCall().thenReturn("Success");
Oraz test awarii z:
Mockito.when(myMock).doTheCall().thenReturn("you failed");
Ale jak mogę sprawdzić, czy jeśli raz (lub dwa) się nie powiedzie, a potem się powiedzie, to dobrze?
doThrow(new RuntimeException()).doNothing().when(myMock).doTheCall();
Najkrótszy sposób na napisanie tego, co chcesz, to
Kiedy podasz w
thenReturn
ten sposób wiele argumentów, każdy argument zostanie użyty najwyżej raz, z wyjątkiem ostatniego argumentu, który jest używany tyle razy, ile potrzeba. Na przykład w tym przypadku, jeśli wykonasz połączenie 4 razy, otrzymasz komunikat „Sukces”, „zawiodłeś”, „zawiodłeś”, „zawiodłeś”.źródło
Ponieważ komentarz, który się z tym wiąże, jest trudny do odczytania, dodam sformatowaną odpowiedź.
Jeśli próbujesz to zrobić za pomocą
void
funkcji, która po prostu zgłasza wyjątek, po którym następuje krok braku zachowania, możesz zrobić coś takiego:źródło
Aby dodać do tej i tej odpowiedzi, możesz również użyć pętli do łączenia w łańcuch udawanych połączeń. Jest to przydatne, jeśli chcesz kilka razy kpić z tego samego lub w jakiś sposób.
Np. (Aczkolwiek naciągany):
źródło
Mam inną sytuację, chciałem mockować
void
funkcję dla pierwszego wywołania i uruchomić ją normalnie przy drugim wywołaniu.To działa dla mnie:
źródło