Próbuję, aby jeden z mockowanych obiektów rzucał sprawdzony wyjątek, gdy wywoływana jest określona metoda. Próbuję następujących rzeczy.
@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
List<String> list = mock(List.class);
when(list.get(0)).thenThrow(new SomeException());
String test = list.get(0);
}
public class SomeException extends Exception {
}
Jednak powoduje to następujący błąd.
org.testng.TestException:
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException
Patrząc na dokumentację Mockito , używają tylko RuntimeException
, czy nie można wrzucić sprawdzonych wyjątków z pozorowanego obiektu za pomocą Mockito?
Throws
adnotację, aby kompilator wygenerował ten sam kod bajtowy, co deklarowanie rzutów w równoważnym kodzie Java. Więcej informacji można znaleźć [tutaj] ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/… ).Rozwiązaniem jest użycie
willAnswer()
metody.Na przykład poniższe działa (i nie
MockitoException
zgłasza a, ale w rzeczywistości rzuca zaznaczenieException
zgodnie z wymaganiami) przy użyciuBDDMockito
:Odpowiednik dla zwykłego Mockito użyłby tej
doAnswer
metodyźródło
willAnswer( invocation -> { throw new Exception("abc msg"); }).given(someObj).someMethod(stringArg1);
gdy metoda zwracavoid
.willThrow()
zwykle pozwala, napisałem GistdoAnswer
odnhaarman.mockitokotlin2
Należy zauważyć, że w ogóle, Mockito ma umożliwić wyrzucanie sprawdzonych wyjątków, tak długo, jak wyjątek jest zadeklarowana w podpisie wiadomości. Na przykład podane
legalne jest pisanie:
Jeśli jednak wyrzucisz sprawdzony wyjątek niezadeklarowany w sygnaturze metody, np
Mockito zawiedzie w czasie wykonywania z nieco mylącym, ogólnym komunikatem:
Może to prowadzić do przekonania, że zaznaczone wyjątki generalnie nie są obsługiwane, ale w rzeczywistości Mockito próbuje tylko powiedzieć, że ten sprawdzony wyjątek nie jest ważny dla tej metody .
źródło
Jest rozwiązanie z Kotlinem:
Skąd pochodzi
źródło
To działa dla mnie w Kotlinie:
Uwaga: zgłoś dowolny zdefiniowany wyjątek inny niż Exception ()
źródło
Exception