В этом посте показано, как проверить наличие ожидаемых исключений с помощью JUnit . Давайте начнем со следующего класса, который мы хотим протестировать:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
public class Person { private final String name; private final int age; /** * Creates a person with the specified name and age. * * @param name the name * @param age the age * @throws IllegalArgumentException if the age is not greater than zero */ public Person(String name, int age) { this .name = name; this .age = age; if (age <= 0 ) { throw new IllegalArgumentException( 'Invalid age:' + age); } } } |
В приведенном выше примере конструктор Person
создает IllegalArgumentException
если возраст человека не больше нуля. Есть разные способы проверить это поведение:
Подход 1: Используйте правило ExpectedException
Это мой любимый подход. Правило ExpectedException позволяет вам указать в тесте, какое исключение вы ожидаете и даже что такое сообщение об исключении. Это показано ниже:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class PersonTest { @Rule public ExpectedException exception = ExpectedException.none(); @Test public void testExpectedException() { exception.expect(IllegalArgumentException. class ); exception.expectMessage(containsString( 'Invalid age' )); new Person( 'Joe' , - 1 ); } } |
Подход 2. Укажите исключение в аннотации @Test.
Как показано во фрагменте кода ниже, вы можете указать ожидаемое исключение в аннотации @Test
. Тест пройдет только в том случае, если метод test выдает исключение из указанного класса. К сожалению, вы не можете проверить сообщение об исключении с помощью этого подхода.
1
2
3
4
|
@Test (expected = IllegalArgumentException. class ) public void testExpectedException2() { new Person( 'Joe' , - 1 ); } |
Подход 3: Используйте блок try-catch
Это «традиционный» подход, который использовался в старых версиях JUnit до введения аннотаций и правил. Окружите свой код предложением try-catch и проверьте, выбрасывается ли исключение. Не забудьте сделать тест неудачным, если не сгенерировано исключение!
1
2
3
4
5
6
7
8
9
|
@Test public void testExpectedException3() { try { new Person( 'Joe' , - 1 ); fail( 'Should have thrown an IllegalArgumentException because age is invalid!' ); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), containsString( 'Invalid age' )); } } |
Ссылка: тестирование ожидаемых исключений с помощью правил JUnit от нашего партнера по JCG Фахда Шарифа в блоге fahd.blog .