1. Въведение
В този бърз урок ще разгледаме как да тестваме дали е било хвърлено изключение с помощта на библиотеката JUnit.
Ние, разбира се, ще се погрижим да покрием както версиите JUnit 4, така и JUnit 5.
2. JUnit 5
JUnit 5 API за твърдения на Юпитер въвежда метода assertThrows за заявяване на изключения.
Това взема типа на очакваното изключение и изпълним функционален интерфейс, където можем да предадем тествания код чрез ламбда израз:
@Test public void whenExceptionThrown_thenAssertionSucceeds() { Exception exception = assertThrows(NumberFormatException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }
Ако очакваното изключение бъде хвърлено , assertThrows връща изключението, което ни позволява да заявяваме и върху съобщението.
Освен това е важно да се отбележи, че това твърдение е изпълнено, когато затвореният код изхвърля изключение от типа NullPointerException или някой от неговите производни типове.
Това означава, че ако предадем Exception като очакван тип изключение, всяко хвърлено изключение ще направи твърдението успешно, тъй като Exception е супер-тип за всички изключения.
Ако променим теста по-горе, за да очакваме RuntimeException , това също ще премине:
@Test public void whenDerivedExceptionThrown_thenAssertionSucceds() { Exception exception = assertThrows(RuntimeException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }
Методът assertThrows () дава възможност за по-фино управление за логиката на твърдение за изключение, защото можем да използваметя около определени части на кода.
3. JUnit 4
Когато използваме JUnit 4, можем просто да използваме очаквания атрибут на анотацията @Test, за да декларираме, че очакваме изключение да бъде хвърлено навсякъде в анотирания метод за тестване.
В резултат на това, когато тестът се изпълни, той ще се провали, ако посоченото изключение не бъде хвърлено и ще премине, ако бъде хвърлено:
@Test(expected = NullPointerException.class) public void whenExceptionThrown_thenExpectationSatisfied() { String test = null; test.length(); }
В този пример декларирахме, че очакваме тестовият ни код да доведе до NullPointerException .
Това е достатъчно, ако се интересуваме само от твърдението, че е хвърлено изключение.
Когато трябва да проверим някои други свойства на изключението, можем да използваме правилото ExpectedException .
Нека да видим пример за проверка на свойството на съобщението на изключение:
@Rule public ExpectedException exceptionRule = ExpectedException.none(); @Test public void whenExceptionThrown_thenRuleIsApplied() { exceptionRule.expect(NumberFormatException.class); exceptionRule.expectMessage("For input string"); Integer.parseInt("1a"); }
В горния пример първо декларираме правилото ExpectedException . След това в нашия тест ние твърдим, че кодът, който се опитва да анализира целочислена стойност, ще доведе до NumberFormatException със съобщението „За входен низ“.
4. Заключение
В тази статия разгледахме установяването на изключения както с JUnit 4, така и с JUnit 5.
Пълният изходен код за примерите е достъпен на GitHub.