Я написал несколько тестов JUnit с @Test
аннотацией. Если мой метод теста выдает проверенное исключение и если я хочу подтвердить сообщение вместе с исключением, есть ли способ сделать это с помощью JUnit@Test
аннотации ? AFAIK, JUnit 4.7 не предоставляет эту функцию, но есть ли в будущих версиях ее? Я знаю, что в .NET вы можете утверждать сообщение и класс исключений. Ищете похожую функцию в мире Java.
Это то, что я хочу:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
@expectedExceptionMessage
в PHPUnit есть аннотация.Ответы:
Вы можете использовать
@Rule
аннотациюExpectedException
, например:Обратите внимание, что пример в
ExpectedException
документации (в настоящее время) неверен - здесь нет открытого конструктора, поэтому вы должны его использоватьExpectedException.none()
.источник
expectMessage
была указана пустая строка, сравнение для сообщения не проводилосьthrows RuntimeException
после добавления код, который выдает исключение. Не лови это ...failure.expectMessage(CoreMatchers.equalTo(...))
Мне нравится
@Rule
ответ. Однако, если по какой-то причине вы не хотите использовать правила. Есть третий вариант.источник
Вы должны использовать
@Test(expected=SomeException.class)
? Когда мы должны утверждать фактическое сообщение об исключении, это то, что мы делаем.источник
@Test(expected=...)
иExpectedException
является то , что я видел много раз кто - то забывчивость поставить вызовfail()
на концеtry
блока . Если проверка кода не обнаружена, ваш тест может быть ложно-положительным и всегда проходить успешно.В JUnit 4.13 вы можете сделать:
Это также работает в JUnit 5, но с другим импортом:
источник
На самом деле, лучше всего использовать try / catch. Зачем? Потому что вы можете контролировать место, где вы ожидаете исключения.
Рассмотрим этот пример:
Что если однажды код будет изменен и подготовка к тесту вызовет исключение RuntimeException? В этом случае реальный тест даже не тестируется, и даже если он не выдает никаких исключений, тест пройдет успешно.
Вот почему гораздо лучше использовать try / catch, чем полагаться на аннотацию.
источник
RuntimeException
в качестве примера, заменить это исключение на любое другое исключение.У Райсторма был хороший ответ. Я тоже не большой поклонник правил. Я делаю нечто подобное, за исключением того, что создаю следующий вспомогательный класс, чтобы улучшить читаемость и удобство использования, что в первую очередь является одним из больших плюсов аннотаций.
Добавьте этот служебный класс:
Затем для моего модульного теста мне нужен только этот код:
источник
При использовании @Rule набор исключений применяется ко всем методам тестирования в классе Test.
источник
Мне никогда не нравился способ утверждать исключения с Junit. Если я использую «ожидаемый» в аннотации, кажется, с моей точки зрения, мы нарушаем шаблон «дано, когда, тогда», потому что «тогда» помещается вверху определения теста.
Также, если мы используем «@Rule», нам приходится иметь дело с таким большим количеством стандартного кода. Итак, если вы можете установить новые библиотеки для своих тестов, я бы посоветовал взглянуть на AssertJ (эта библиотека теперь поставляется с SpringBoot)
Затем тест, который не нарушает принципы «дано / когда / тогда» и выполняется с помощью AssertJ для проверки:
1 - Исключением является то, что мы ожидаем. 2 - также есть ожидаемое сообщение
Будет выглядеть так:
источник
Мне нравится ответ user64141, но я нашел, что он может быть более обобщенным. Вот мой дубль:
Обратите внимание, что оставление оператора «fail» в блоке try приводит к перехвату связанного исключения утверждения; использование возврата в операторе catch предотвращает это.
источник
Импортируйте библиотеку catch-exception и используйте ее. Это намного чище, чем
ExpectedException
правило илиtry-catch
.Пример формы их документов:
источник
источник
Junit
ноTestNG