Статьи

Тестирование ожидаемых исключений с помощью правил JUnit

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