Статьи

Проверка того, что брошено в тестах Java

Кто-то предложил идею использовать блоки 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, являются их собственными.