Кто-то предложил идею использовать блоки try и catch в модульных тестах в Java:
|
1
2
3
4
5
6
7
8
|
@Testpublic void test() { try { callSomeCode(); } catch (Exception e) { assertEquals("foo", e.getMessage()); }} |
Вышеуказанное заманчиво, но не работает . Если тестируемый код не выдал, то утверждение не будет выполнено.
Итак, чтобы это исправить:
|
01
02
03
04
05
06
07
08
09
10
11
|
@Testpublic void test() { try { callSomeCode(); // if we get here there was no exception fail(); } catch (Exception e) { assertEquals("foo", e.getMessage()); }} |
Мы добавили fail которая делает полный тест, что правильная вещь была брошена, но это неудобно.
Это пример утверждения о перенапряжении из тестовых запахов .
Сколько способов проверить, что бросили?
Все способы, которые я знаю:
- Сделать это долгий путь (выше)
- Используйте
@Test(expected = ... )чтобы проверить, заканчивается ли тест правильным исключением - Используйте правило
ExpectedExceptionJUnit, которое позволяет вам определить, чем вы хотите завершить свой тест - Используйте утверждение, которое ловит исключение для вас
Почему шаблон ожидаемого исключения не работает
Правило, объясненное здесь в сравнении с подходом обходного пути, позволяет вам определить критерии успеха тестовой функции, которая заканчивается исключением.
Например
|
01
02
03
04
05
06
07
08
09
10
11
12
|
// default to expecting no exception@Rulepublic ExpectedException expectedException = ExpectedException.none();@Testpublic void test() { // the call should end in the right exception expectedException.expectMessage(is("foo")); // do the call callSomeCode();} |
Это привлекательно, но все же неправильно
Что случилось с данным / когда / потом?
Тесты должны читаться сверху вниз с утверждениями в конце. Шаблон ожидаемых исключений должен определять утверждения / ожидания до вызова, который их производит, что является обратным.
Наоборот:
|
1
2
3
4
5
|
@Testpublic void test() { assertThatThrownBy(() -> callSomeCode()) .hasMessage("foo");} |
Это сжато и читает вперед.
|
Посмотрите оригинальную статью здесь: Проверка того, что брошено в тестах Java Мнения, высказанные участниками Java Code Geeks, являются их собственными. |