Как я должен фиксировать состояние объекта при выполнении теста JUnit? - PullRequest
1 голос
/ 14 сентября 2011

У меня есть простой тест, настроенный в JUnit, в соответствии с

public void testGetBar() throws MyException{
  Foo f = new Foo();
  f.setup();

  assertEquals(new Bar("1234"), f.getBar());
}

Предположим, getBar() выбросил MyException: JUnit отмечает это как тест «по ошибке», и я замечаючто я облажался метод.Ага, юнит-тестирование работает!Однако у меня нет возможности узнать, что не так с моим объектом Foo, который заставил его выбросить, когда я попытался getBar() на нем, не возвращаясь назад и, например, не выполняя тест через отладчик или не добавляя оператор записи в журнал.Все говорят, что это плохая идея - ловить исключения в ваших тестах JUnit, поэтому кажется, что делать это не стоит:

try{
  assertEquals(new Bar("1234"), f.getBar());
} catch(MyException e) {
  log.error(f.toString());
  throw e;
}

, но это все, что я могу придумать.Нет ли в JUnit-y краткого сообщения о том, что «когда в этом тесте есть исключение, выйдите из этого, того и другого состояния объекта (каким-либо образом)», чтобы можно было легко определить, где что-то пошло не так?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

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

Я не уверен, почему вы хотите регистрировать исключения по условию. модульный тест должен всегда проходить или всегда выдавать исключение . Если вы хотите ожидать исключения, добавьте аннотацию @Test(expection=Exception.class)

Если вы действительно хотите регистрировать исключения, самый элегантный способ - аннотировать ваш тестовый класс с помощью @RunWith(MyRunner.class) и создать класс MyRunner extends BlockJUnit4Runner, который обрабатывает регистрацию.

0 голосов
/ 14 сентября 2011

Вы бы не обернули весь код модульного тестирования в обработчики исключений: только те, с которыми у вас проблемы. Оставлять JUnit для перехвата непредвиденных исключений как ошибок также хорошо: оберните нарушающий код в обработчик, когда это произойдет, и вы исследуете проблему (затем удалите снова).

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

Конечно, вы также захотите выполнить модульное тестирование генерации исключений: в этом случае вы определенно захотите обернуть вызов вызывающей функции в обработчик, а затем сгенерировать fail (), если исключение не произошло.

...