Три момента о JUnit:
Тесты должны быть точными, они должны быть однозначно пройдены или не пройдены исключительно в зависимости от того, как настроены тестовые входные данные.
Тесты должны сообщать об ошибках обратно в фреймворк.
Тесты не должны полагаться на чтение их вывода.
Ваш пример не работает по всем трем пунктам. Если возникнет исключение или нет, тест все равно будет пройден. Если возникает исключение, JUnit никогда не узнает об этом и не может включить его в результаты теста. Единственный способ узнать, что что-то пошло не так, — это прочитать, что тест записывает в стандартный вывод, из-за чего ошибки слишком легко игнорировать. Это не очень удобный способ написания тестов.
JUnit был разработан, чтобы упростить выполнение правильных действий и дать разработчикам полезную обратную связь. Если из тестового метода выбрасывается исключение, оно перехватывается фреймворком. Если тест был помечен исключением, указывающим, что ожидается исключение, то платформа помечает тест как пройденный. В противном случае платформа не проходит тест и записывает трассировку стека для отчетности. Фреймворк сообщает, какие утверждения терпят неудачу и какие неожиданные исключения произошли, чтобы все знали, сработали ли тесты или нет.
Если вы ожидаете, что тест завершится успешно без создания исключения, тогда, если что-либо в тесте может вызвать проверенное исключение, добавьте throws Exception
к сигнатуре метода тестирования. Добавление throws
к сигнатуре не означает, что метод должен что-либо генерировать, он просто позволяет генерировать любые возникающие исключения, чтобы среда тестирования могла их перехватить.
Единственный случай, когда вы действительно поймаете исключение в тесте, — это когда вы хотите проверить утверждения об исключении; например, вы можете проверить, соответствует ли сообщение об исключении тому, что вы ожидаете, или если для исключения установлена причина. В этом случае вы должны добавить Assert.fail()
в конец блока try, чтобы отсутствие исключения привело к сбою теста.
Плохо не наличие блока try-catch, а отсутствие чего-либо, что может привести к сбою теста.
Когда вы сначала пишете тест, сделайте так, чтобы он провалился. Таким образом вы доказываете себе, что знаете, что делает тест, и подтверждаете, что в случае сбоя вы будете об этом осведомлены.
person
Nathan Hughes
schedule
16.07.2015