Czy istnieje lepszy sposób na stwierdzenie, że metoda zgłasza wyjątek w JUnit 5?
Obecnie muszę użyć @Rule, aby sprawdzić, czy mój test zgłasza wyjątek, ale to nie działa w przypadkach, w których oczekuję, że wiele metod zgłasza wyjątki w moim teście.
java
junit
junit5
junit-jupiter
steventrouble
źródło
źródło
Odpowiedzi:
Możesz użyć
assertThrows()
, co pozwala przetestować wiele wyjątków w ramach tego samego testu. Dzięki obsłudze lambd w Javie 8 jest to kanoniczny sposób testowania wyjątków w JUnit.Według dokumentów JUnit :
źródło
() ->
wskazuje na wyrażenie lambda, które akceptuje zero argumentów. Zatem „kod produkcyjny”, który ma wywołać wyjątek, znajduje się w wskazanym bloku kodu (tj.throw new...
Instrukcji w nawiasach klamrowych).W Javie 8 i JUnit 5 (Jupiter) możemy domagać się wyjątków w następujący sposób. Za pomocą
org.junit.jupiter.api.Assertions.assertThrows
Takie podejście wykorzysta interfejs funkcjonalny
Executable
worg.junit.jupiter.api
.Patrz:
źródło
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
Zmienili to w JUnit 5 (oczekiwany: wyjątek InvalidArgumentException, metoda faktyczna: wywołana), a kod wygląda następująco:
źródło
Teraz Junit5 zapewnia sposób na potwierdzenie wyjątków
Możesz przetestować zarówno wyjątki ogólne, jak i niestandardowe
Ogólny scenariusz wyjątku:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
Możesz znaleźć próbkę do przetestowania wyjątku tutaj: podaj przykładowy kod wyjątku
ExpectCustomException.java
ExpectCustomExceptionTest.java
źródło
Myślę, że jest to jeszcze prostszy przykład
Wywołanie
get()
opcjonalnego zawierającego pustegoArrayList
rzuciNoSuchElementException
.assertThrows
deklaruje oczekiwany wyjątek i podaje dostawcę lambda (nie przyjmuje argumentów i zwraca wartość).Dzięki @prime za odpowiedź, którą mam nadzieję opracowałem.
źródło
assertThrows
zwraca zgłoszony wyjątek. Możesz więc zrobić to tak, jakNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
poniżej, możesz wykonać dowolne twierdzenia dotyczące obiektu wyjątku, jaki chcesz.Możesz użyć
assertThrows()
. Mój przykład pochodzi z dokumentacji http://junit.org/junit5/docs/current/user-guide/źródło
Jeszcze prostsza jedna wkładka. W tym przykładzie nie są wymagane wyrażenia lambda ani nawiasy klamrowe w Javie 8 i JUnit 5
źródło
Wydaje mi się, że w dokumentacji tego konkretnego przykładu wystąpił błąd. Metodą, która jest zamierzona, jest expectThrows
źródło
Oto prosty sposób.
Udaje się to tylko wtedy, gdy zostanie zgłoszony wyjątek.
źródło