Перейти к основному содержимому

Утверждение исключения в JUnit 4 и 5

· 3 мин. чтения

1. Введение

В этом кратком руководстве мы рассмотрим, как проверить, было ли создано исключение с помощью библиотеки JUnit.

Мы, конечно же, позаботимся о версиях JUnit 4 и JUnit 5.

2. ИЮНЬ 5

JUnit 5 API утверждений Jupiter представляет метод assertThrows для подтверждения исключений.

Это принимает тип ожидаемого исключения и функциональный интерфейс Executable , где мы можем передать тестируемый код через лямбда-выражение:

@Test
public void whenExceptionThrown_thenAssertionSucceeds() {
Exception exception = assertThrows(NumberFormatException.class, () -> {
Integer.parseInt("1a");
});

String expectedMessage = "For input string";
String actualMessage = exception.getMessage();

assertTrue(actualMessage.contains(expectedMessage));
}

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

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

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

Если мы изменим тест выше, чтобы ожидать RuntimeException , это также пройдет:

@Test
public void whenDerivedExceptionThrown_thenAssertionSucceds() {
Exception exception = assertThrows(RuntimeException.class, () -> {
Integer.parseInt("1a");
});

String expectedMessage = "For input string";
String actualMessage = exception.getMessage();

assertTrue(actualMessage.contains(expectedMessage));
}

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

3. ИЮНЬ 4

При использовании JUnit 4 мы можем просто использовать ожидаемый атрибут аннотации @Test , чтобы объявить, что мы ожидаем возникновения исключения в любом месте аннотированного тестового метода.

В результате, когда тест будет запущен, он завершится ошибкой, если указанное исключение не сгенерировано, и будет пройден, если оно сгенерировано:

@Test(expected = NullPointerException.class)
public void whenExceptionThrown_thenExpectationSatisfied() {
String test = null;
test.length();
}

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

Этого достаточно, если мы заинтересованы только в том, чтобы подтвердить, что исключение выброшено.

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

Давайте посмотрим на пример проверки свойства сообщения исключения:

@Rule
public ExpectedException exceptionRule = ExpectedException.none();

@Test
public void whenExceptionThrown_thenRuleIsApplied() {
exceptionRule.expect(NumberFormatException.class);
exceptionRule.expectMessage("For input string");
Integer.parseInt("1a");
}

В приведенном выше примере мы сначала объявляем правило ExpectedException . Затем в нашем тесте мы утверждаем, что код, который пытается проанализировать значение Integer , приведет к исключению NumberFormatException с сообщением «Для входной строки».

4. Вывод

В этой статье мы рассмотрели утверждение исключений как с JUnit 4, так и с JUnit 5.

Полный исходный код примеров доступен на GitHub .