Вы подходите к этому неправильно. Просто проверьте свою функциональность: если сгенерировано исключение, тест автоматически провалится. Если исключение не выдано, все ваши тесты станут зелеными.
Я заметил, что этот вопрос вызывает интерес время от времени, поэтому я буду немного расширяться.
Предпосылки к юнит-тестированию
Когда вы проводите модульное тестирование, важно определить для себя, что вы считаете единицей работы. В основном: извлечение вашей кодовой базы, которая может включать или не включать несколько методов или классов, представляющих один элемент функциональности.
Или, как определено в «Искусстве модульного тестирования», 2-е издание Роя Ошерова , стр. 11:
Испытательная установка представляет собой автоматизированный фрагмент кода , который вызывает единица работы тестируется, а затем проверяют некоторые предположения о одном конечном результате этой единицы. Модульный тест почти всегда пишется с использованием инфраструктуры модульного тестирования. Это может быть написано легко и работает быстро. Это заслуживающий доверия, читаемый и обслуживаемый. По своим результатам он последовательный, пока производственный код не изменился.
Важно понимать, что одна единица работы обычно не просто один метод, но на самом базовом уровне это один метод, и после этого он инкапсулируется другой единицей работ.
В идеале у вас должен быть метод тестирования для каждой отдельной единицы работы, чтобы вы всегда могли сразу увидеть, где что-то идет не так. В этом примере есть базовый метод, getUserById()
который будет возвращать пользователя, и всего будет 3 единицы работ.
Первая единица работы должна проверить, возвращается ли верный пользователь в случае правильного и недействительного ввода.
Любые исключения, которые вызываются источником данных, должны быть обработаны здесь: если ни один пользователь не присутствует, должен быть тест, который демонстрирует, что исключение выдается, когда пользователь не может быть найден. Примером этого может быть тот, IllegalArgumentException
который пойман с @Test(expected = IllegalArgumentException.class)
аннотацией.
После того, как вы обработали все свои варианты использования для этой основной единицы работы, вы переходите на новый уровень. Здесь вы делаете то же самое, но вы обрабатываете только исключения, которые приходят с уровня прямо под текущим. Это сохраняет ваш тестовый код хорошо структурированным и позволяет быстро бегать по архитектуре, чтобы найти, где что-то идет не так, вместо того, чтобы прыгать повсюду.
Обработка правильного и ошибочного ввода теста
На данный момент должно быть ясно, как мы будем обрабатывать эти исключения. Существует 2 типа ввода: допустимый ввод и неправильный ввод (ввод в строгом смысле действителен, но не корректен).
Когда вы работаете с правильным вводом, вы устанавливаете неявное ожидание того, что любой тест, который вы напишите, сработает.
Такой способ вызова может выглядеть следующим образом : existingUserById_ShouldReturn_UserObject
. Если этот метод не срабатывает (например, выдается исключение), то вы знаете, что что-то пошло не так, и вы можете начать копать.
Добавив еще один метод test ( nonExistingUserById_ShouldThrow_IllegalArgumentException
), который использует ошибочный ввод и ожидает исключения, вы можете увидеть, делает ли ваш метод то, что он должен делать с неправильным вводом.
TL; DR
Вы пытались сделать две вещи в своем тесте: проверить правильность и ошибочность ввода. Разделив это на два метода, каждый из которых выполняет одну задачу, вы получите намного более четкие тесты и гораздо лучший обзор того, где что-то идет не так.
Имея в виду многоуровневую единицу работ, вы также можете уменьшить количество тестов, необходимых для слоя, который находится выше в иерархии, потому что вам не нужно учитывать все, что могло бы пойти не так на нижних уровнях: Уровни ниже текущего являются виртуальной гарантией того, что ваши зависимости работают, и если что-то пойдет не так, это на вашем текущем уровне (при условии, что нижние уровни сами не выдают ошибок).