Это продолжение туториала по 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());
}
Оглавление
-
Assertions API assertThrows ().
Синтаксис
Вывод теста
Ожидаемое исключение генерируется в тесте.
Сгенерировано исключение другого типа, или не сгенерировано исключение
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.
Хорошего изучения!!!