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