Это против лучшей практики бросать Исключение в большинстве тестов JUnit? - PullRequest
44 голосов
/ 23 марта 2010

Почти все мои тесты JUnit написаны со следующей подписью:

public void testSomething() throws Exception

Я рассуждаю так: я могу сосредоточиться на том, что я тестирую, а не на обработке исключений, которые JUnit предоставляет мне бесплатно Но я что-то упустил, делая это? Это против лучшей практики? Получу ли я что-нибудь, явно отлавливая определенные исключения в моем тесте, а затем провалив их (*)?

Ответы [ 4 ]

55 голосов
/ 23 марта 2010

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

С другой стороны, если вы пишете тест, который должен вызывать исключение, то вы либо хотите использовать вариант @Test(expected=IllegalArgumentException.class) аннотации JUnit 4, либо более распространенную идиому JUnit 3:

try {
  target.someMethodToTest();
  fail("Should have gotten an exception");
} catch (IllegalStateException ise) {
  //expected, it's all good
}
11 голосов
/ 23 марта 2010

НЕ ловите и не терпите неудачу - вы потеряете ценную информацию.Пусть все исключения сработают.Это означает, что вам нужно добавить каждое проверенное исключение в вашу подпись, которая может быть выброшена.Тем не менее, я бы посоветовал вам не выходить из лени и слепо использовать throws Exception по привычке.Это освобождает вас от необходимости даже думать о том, как ваш API действительно ведет себя в отношении исключений.

3 голосов
/ 23 марта 2010

Если выдается исключение, а вы его не ожидаете, проверка должна завершиться неудачей.

Если это неконтролируемое исключение, я разрешаю генерировать исключение, и JUnit не проходит тест.

Если это проверенное исключение, у вас есть выбор: либо добавить исключение в предложение throws сигнатуры метода, либо перехватить его внутри метода. Компилятор навязывает вам выбор, потому что вы не можете запустить код без любого из этих вариантов.

В последнее время я склонен не ловить исключения в своих тестах. Если предполагается создать исключение, я помечаю его как таковое аннотацией. Если это вызывает неконтролируемое исключение, я оставил JUnit неудачным для меня. Если это проверенное исключение, я добавляю предложение throws к сигнатуре метода и оставляю JUnit неудачным для меня.

3 голосов
/ 23 марта 2010

Основное преимущество заключается в том, что вы тестируете некоторый сценарий, который требует создания исключения (например, обработка err-r)

Вы можете в JUnit4 использовать что-то вроде: @Test (ожидается = ArithmeticException.class), но некоторые люди считают, что это сложнее для чтения / меньше намерений, чем для явного блока try {} catch (Exception e), и если вы хотел проверить состояние (скажем, какого-нибудь фиктивного объекта, или посмотреть, было ли исключение выброшено в нужном месте, зарегистрировано или тому подобное)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...