2015-04-16 19 views
16

Code: -Czy błąd asercji zostanie przechwycony przez blok catch dla wyjątku Java?

try { 
    Assert.assertEquals("1", "2"); 
} catch (Exception e) { 
    System.out.println("I am in error block"); 
} 

Jeżeli oświadczenia twierdzą, nie chciałbym, aby uchwycić błąd w bloku catch. Próbuję z powyższym kodem i nie dzieje się to.

Czy błąd potwierdzenia zostanie przechwycony przez blok catch dla wyjątku Java?

+2

Dlaczego i tak chcesz to zrobić? Wygląda to na poważne nadużycie "Assert", które jest przeznaczone do testów jednostkowych – Dragondraikk

Odpowiedz

27

Prawie odpowiedziałeś na własne pytanie. Twój blok przechwytywania nie złapie AssertionError, który zostanie odrzucony przez Assert, ponieważ jest to Error (lub, dokładniej, rozciąga się na java.lang.Error). See the docs, aby uzyskać więcej informacji na ten temat. Twój blok catch łapie tylko Throwable obiektów, które rozciągają java.lang.Exception

Jeśli naprawdę chcesz go złapać - trzeba użyć

catch (AssertionError e) { 
... 

Jednak, jak others mieć mentioned, jest to bardzo nietypowy sposób używać twierdzeń - zwykle powinny one przejść, a jeśli się nie powiedzie, bardzo rzadko zdarza się, że chcesz kontynuować realizację programu. Właśnie dlatego niepowodzenie rzucało raczej Error niż Exception. Możesz przeczytać więcej o (nie) łapaniu Error w this question.

Czy jesteś pewien, że nie chcesz tylko testu - if (variableName == "1")?

NB jeśli testowanie jednostkowe testowy kod pomocnika, jak dopasowującego, to może mieć sens, aby złapać AssertionError.

+0

Gdy ktoś chce sprawdzić, czy klasa pomocnicza testu jednostkowego postępuje właściwie (testując ją jednostkowo ;-)), można oczekiwać, że uda się złapać taki błąd AssertionError. To byłaby ważna sytuacja, by ją złapać, prawda? – gkephorus

+0

@gkephorus tak, przypuszczam, że to możliwe. Możesz edytować to jako "N.B." jeśli chcesz, a ja to zatwierdzę :) –

+0

@JRichardSnape - Chcę porównać dwa obiekty Java (uzyskane z obiektów json), które mają tylko zmienne łańcuchowe z elementami pobierającymi i ustawiającymi, np. POJO. Chcę tylko porównać niektóre (nie wszystkie) zmienne, aby ustalić dopasowanie. W przypadku jednej ze zmiennych należy porównać tylko wartość częściową.Czy dobrym pomysłem jest umieszczenie wszystkich moich assertów w bloku catch catch (AssertionError)? W ten sposób mogę zwrócić wartość false w części catch, aby wskazać, które pole jest niedopasowane, z użytecznym łańcuchem komunikatu o błędzie. W ten sposób nie będę musiał pisać kilku, jeśli jeszcze. Brzmi ok? – testerjoe2

2

Cóż, wierzę, że używasz JUnit do pisania testów. W takim przypadku nie powinieneś złapać swojego Assert.assertEquals(), ponieważ powinny one przejść do normalnego wykonania testu. Jeśli zgłasza wyjątek, oznacza to, że twój kod nie działa tak, jak powinien.

+0

tak, mój kod assert zgłasza wyjątek. Ale chcę przechwycić wszystkie błędy takie twierdzenia lub jakikolwiek inny błąd klasy Wyjątek. Jak mogę to zrobić ? – karan

+2

Nie możesz. 'AssertionError' dziedziczy po' Error', co oznacza, że ​​'try ... catch' nie będzie w stanie obsłużyć ich. Zobacz tutaj: https://docs.oracle.com/javase/7/docs/api/java/lang/AssertionError.html. Jeśli i tak będziesz musiał je złapać, zobacz odpowiedź SpaceCowboy. – Aakash

2

Jeśli chcesz złapać błędy w ten sposób trzeba coś jak następuje:

if (num == 1 || num == 2) { 
    throw new Exception(); 
} 

Można by stworzyć własną klasę wyjątku i przechodzą w żądanej wiadomości.