Вы приближаетесь к этому неправильно. Просто проверьте свою функциональность: если вызывается исключение, тест автоматически завершится ошибкой. Если исключение не будет выбрано, ваши тесты будут зелеными.
Я заметил, что этот вопрос время от времени вызывает интерес, поэтому я немного расширюсь.
фон для модульного тестирования
Когда вы модульное тестирование, важно определить для себя, что вы считаете единицы работы. В основном: извлечение вашей кодовой базы, которая может включать или не включать несколько методов или классов, которые представляют собой единую функциональность.
Или, как это определено в The art of Unit Testing, 2nd Edition by Roy Osherove, страница 11:
Испытание на блок представляет собой автоматизированную часть кода, которая вызывает единицу работы тестируется, а затем проверяет некоторые предположения относительно одного конечного результата этой единицы. Единичный тест почти всегда записывается с использованием модульной системы тестирования. Его можно легко писать и быстро запускать. Это надежный, читаемый и поддерживаемый. Он последователен в своих результатах, пока производственный код не изменился.
Что важно понимать, что одна единица работы обычно это не только один метод, но на самом базовом уровне, это один метод, и после этого он инкапсулируется другим блоком работ.
В идеале вы должны иметь метод испытания для каждого отдельного блока работы, так что вы всегда можете сразу же просмотреть, где дела идут не так. В этом примере есть базовый метод, называемый getUserById()
, который будет возвращать пользователя, и в общей сложности 3 единицы работ.
Первый блок работы должен проверить, возвращается ли действительный пользователь в случае действительного и недействительного ввода.
Любые исключения, которые выбрасываются источником данных, должны обрабатываться здесь: если ни один пользователь не присутствует, должен быть тест, который демонстрирует, что возникает исключение, когда пользователь не может быть найден. Образец этого может быть IllegalArgumentException
, который выловлен аннотацией @Test(expected = IllegalArgumentException.class)
.
После того, как вы обработали все свои возможности для этой базовой единицы работы, вы поднимаетесь на уровень. Здесь вы делаете то же самое, но только обрабатываете исключения, которые исходят от уровня прямо под текущим. Это позволяет хорошо структурировать ваш тестовый код и позволяет быстро пройти через архитектуру, чтобы найти, где все идет не так, вместо того, чтобы прыгать повсюду.
Обращение с ИСПЫТАНИЙ действительный и неисправный вход
На этом этапе должно быть ясно, как мы будем обращаться с этими исключениями.Существует 2 типа ввода: действует вход и неисправный вход (вход действителен в строгом смысле слова, но это неверно).
Когда вы работаете с действительным вводами, вы устанавливаете неявное ожидание того, что любой тест, который вы пишете, будет работать.
Такой вызов метода может выглядеть так: existingUserById_ShouldReturn_UserObject
. Если этот метод выходит из строя (например: исключение выбрасывается), вы знаете, что что-то пошло не так, и вы можете начать копать.
Добавив еще один тест (nonExistingUserById_ShouldThrow_IllegalArgumentException
), который использует входной неисправна и ожидает, что исключение вы можете увидеть действительно ли ваш метод, что он должен делать с неправильным входом.
TL; DR
Вы пытаетесь сделать две вещи в тесте: проверить наличие действительного и неисправного ввода. Разделив это на два метода, каждый из которых делает что-то одно, у вас будет гораздо более четкие тесты и гораздо лучший обзор того, где все идет не так.
Сохраняя многоуровневую структуру работ, вы также можете уменьшить количество тестов, необходимых для слоя, который выше в иерархии, потому что вам не нужно учитывать все, что могло бы пойти не так, как в нижние слои: слои ниже текущего являются виртуальной гарантией того, что ваши зависимости работают, и если что-то пойдет не так, оно находится в вашем текущем слое (при условии, что нижние слои сами не вызывают ошибок).
тест JUnit оценивается несостоявшимся, если он выбрасывает любое исключение, кроме ожидаемого исключения. Обычно исключений не ожидается. – Raedwald
Разве нет различия между ошибкой и ошибкой в JUnit? Первое означает, что тест не прошел, второй означает, что произошло что-то неожиданное. – Vituel
Возможный дубликат [Как проверить, не вызвано ли какое-то конкретное исключение?] (Http://stackoverflow.com/questions/8575653/how-can-i-test-if-a-particular-exception-is-not -thrown) –