В этом посте показано, как проверить наличие ожидаемых исключений с помощью 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
|
@Testpublic 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 .