Как стать автором
Обновить

Ожидаемое исключение JUnit 5

Время на прочтение3 мин
Количество просмотров25K
Автор оригинала: Lokesh Gupta

Это продолжение туториала по JUnit 5. Введение опубликовано здесь.

В JUnit 5, чтобы написать тестовый код, который, как ожидается, вызовет исключение, мы должны использовать Assertions.assertThrows().

В данном примере ожидается, что тестовый код в комментированном блоке вызовет исключение типа ApplicationException.

Использование Assertions.assertThrows()

@Test
void testExpectedException() {

  ApplicationException thrown = Assertions.assertThrows(ApplicationException.class, () -> {
           //Code under test
  });

  Assertions.assertEquals("some message", exception.getMessage());
}

Оглавление

  1. Assertions API assertThrows ().

    • Синтаксис

    • Вывод теста

  2. Ожидаемое исключение генерируется в тесте.

  3. Сгенерировано исключение другого типа, или не сгенерировано исключение

1. Assertions API assertThrows ()

1.1. Синтаксис

Метод assertThrows() утверждает, что выполнение прилагаемого исполняемого блока или лямбда - выражения вызывает исключение типа expectedType. Это перегруженный метод, который принимает следующие параметры.

static <T extends Throwable>T assertThrows(Class<T> expectedType, Executable executable)

static <T extends Throwable>T assertThrows(Class<T> expectedType, Executable executable, String message)

static <T extends Throwable>T assertThrows(Class<T> expectedType, Executable executable, Supplier<String> messageSupplier)
  • expectedType - ожидается, что тестовый код вызовет исключение этого типа.

  • message - если исполняемый код не вызывает никаких исключений, это сообщение будет напечатано вместе с результатом FAIL.

  • messageSupplier - сообщение будет извлечено из него в случае неудачи теста.

1.2. Вывод теста

Если в блоке не было генерировано исключение, executable, то assertThrows() вернет FAIL.

Если выбрасывается исключение другого типа, assertThrows() будет FAIL.

Если блок кода вызывает исключение класса, который является подтипом исключения expectedType, только тогда assertThrows() вернет PASS.

Например, если мы ожидаем, IllegalArgumentException и тест выдает ошибку NumberFormatException, тогда и вывод теста будет PASSпотому что NumberFormatException расширяет класс IllegalArgumentException.

Кроме того, если мы передадим Exception.class в качестве ожидаемого типа исключения, любое исключение, выброшенное из исполняемого блока, сделает результат assertion равным PASS, поскольку Exception является супертипом для всех исключений.

2. Ожидаемое исключение генерируемое в тесте

Ниже приведен очень простой тест, который ожидает, что исключение NumberFormatException будет сгенерировано при выполнении предоставленного блока кода.

Оба теста выдают PASS

@Test
void testExpectedException() {

	NumberFormatException thrown = Assertions.assertThrows(NumberFormatException.class, () -> {
		Integer.parseInt("One");
	}, "NumberFormatException was expected");
	
	Assertions.assertEquals("For input string: \"One\"", thrown.getMessage());
}

@Test
void testExpectedExceptionWithParentType() {

	Assertions.assertThrows(IllegalArgumentException.class, () -> {
		Integer.parseInt("One");
	});
}
  • В тесте testExpectedException, исполняемый код Integer.parseInt("One") генерирует исключение NumberFormatException, если аргумент метода не является допустимым текстовым представлением числа. Метод assertThrows() ожидает это исключение, так что результат теста PASS.

  • В тесте testExpectedExceptionWithParentType, мы выполняем тот же код, но на этот раз мы принимаем исключение IllegalArgumentException, родительское для NumberFormatException. Этот тест тоже проходит.

3. Сгенерировано исключение другого типа, или не сгенерировано исключение

Если исполняемый код вызывает исключение любого другого типа, то результат теста будет FAIL.

И даже если исполняемый код не вызывает никаких исключений, результат теста тоже будет FAIL.

Например, в приведенном ниже примере "1"это допустимое число, поэтому исключение не возникает. Этот тест завершится ошибкой с сообщением в консоли.

@Test
void testExpectedExceptionFail() {
 
	NumberFormatException thrown = Assertions
				.assertThrows(NumberFormatException.class, () -> {
					Integer.parseInt("1");
				}, "NumberFormatException error was expected");
	
	Assertions.assertEquals("Some expected message", thrown.getMessage());
}

В этом посте мы узнали, как написать тест, ожидающий возникновение исключений. Эти тесты полезны при тестировании кода, написанного в блоках catch.

Хорошего изучения!!!

Скачать исходный код

Теги:
Хабы:
Всего голосов 9: ↑6 и ↓3+3
Комментарии0

Публикации

Истории

Работа

Ближайшие события