Napisałem kilka testów JUnit z @Test
adnotacjami. Jeśli moja metoda testowa zgłasza sprawdzony wyjątek i jeśli chcę potwierdzić komunikat wraz z wyjątkiem, czy istnieje sposób, aby to zrobić za pomocą @Test
adnotacji JUnit ? AFAIK, JUnit 4.7 nie udostępnia tej funkcji, ale czy są dostępne w przyszłych wersjach? Wiem, że w .NET możesz potwierdzić komunikat i klasę wyjątku. Szukasz podobnej funkcji w świecie Java.
To jest to czego chcę:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
@expectedExceptionMessage
w PHPUnit znajduje się adnotacja.Odpowiedzi:
Możesz użyć
@Rule
adnotacji wExpectedException
następujący sposób:Zauważ, że przykład w
ExpectedException
dokumentacji jest (obecnie) zły - nie ma publicznego konstruktora, więc musisz użyćExpectedException.none()
.źródło
expectMessage
określono jako pusty ciąg, porównanie wiadomości nie zostało wykonanethrows RuntimeException
po dodaniu kodu, który zgłasza wyjątek. Nie łapcie tego ...failure.expectMessage(CoreMatchers.equalTo(...))
Podoba mi się
@Rule
odpowiedź. Jeśli jednak z jakiegoś powodu nie chcesz używać reguł. Istnieje trzecia opcja.źródło
Czy musisz użyć
@Test(expected=SomeException.class)
? Kiedy musimy potwierdzić faktyczny komunikat wyjątku, robimy to.źródło
@Test(expected=...)
iExpectedException
polega na tym, że wielokrotnie widziałem kogoś, kto zapomniał zadzwonićfail()
na końcutry
bloku . Jeśli nie zostanie przechwycony przez przegląd kodu, test może być fałszywie dodatni i zawsze pozytywny.W JUnit 4.13 możesz:
Działa to również w JUnit 5, ale z różnymi importami:
źródło
W rzeczywistości najlepsze użycie to try / catch. Dlaczego? Ponieważ możesz kontrolować miejsce, w którym oczekujesz wyjątku.
Rozważ ten przykład:
Co się stanie, jeśli pewnego dnia kod zostanie zmodyfikowany, a przygotowanie do testu zgłosi wyjątek RuntimeException? W takim przypadku rzeczywisty test nie jest nawet testowany, a nawet jeśli nie zgłosi żadnego wyjątku, test zostanie zaliczony.
Dlatego o wiele lepiej jest użyć try / catch niż polegać na adnotacji.
źródło
RuntimeException
jako przykładu, zastąp ten wyjątek dowolnym innym wyjątkiem.Raystorm miał dobrą odpowiedź. Nie jestem też wielkim fanem zasad. Robię coś podobnego, z wyjątkiem tego, że tworzę następującą klasę użyteczności, aby zwiększyć czytelność i użyteczność, co jest jednym z największych plusów adnotacji.
Dodaj tę klasę narzędzi:
Następnie do mojego testu jednostkowego potrzebuję tylko tego kodu:
źródło
Jeśli używana jest reguła @, zestaw wyjątków jest stosowany do wszystkich metod testowych w klasie Test.
źródło
Nigdy nie podobało mi się, że w Junit można znaleźć wyjątki. Jeśli użyję słowa „oczekiwany” w adnotacji, z mojego punktu widzenia wydaje się, że naruszamy „dany, kiedy, to” wzorzec, ponieważ „wtedy” znajduje się na górze definicji testu.
Ponadto, jeśli użyjemy „@Rule”, będziemy musieli poradzić sobie z tak dużą liczbą kodów źródłowych. Więc jeśli możesz zainstalować nowe biblioteki do swoich testów, sugeruję zajrzeć do AssertJ (ta biblioteka jest teraz dostarczana z SpringBoot)
Następnie test, który nie narusza zasad „dany / kiedy / wtedy” i jest wykonywany przy użyciu AssertJ w celu weryfikacji:
1 - Spodziewamy się wyjątku. 2 - Ma również oczekiwany komunikat
Będzie wyglądać tak:
źródło
Podoba mi się odpowiedź user64141, ale stwierdziłem, że można ją bardziej uogólnić. Oto moje zdanie:
Zauważ, że pozostawienie instrukcji „fail” w bloku try powoduje przechwycenie powiązanego wyjątku asercji; zapobiega temu przez użycie return w instrukcji catch.
źródło
Zaimportuj bibliotekę wyjątków przechwytywania i użyj jej. Jest znacznie czystszy niż
ExpectedException
reguła lubtry-catch
.Przykład z ich dokumentów:
źródło
źródło
Junit
nasuwa się, aleTestNG