Ви підходите до цього неправильно. Просто перевірте свою функціональність: якщо виняток буде викинутий, тест автоматично не вдасться. Якщо не виняток, ваші тести стануть зеленими.
Я помітив, що час від часу це питання цікавить збирачів, тому я трохи розширюся.
Передумови для одиничного тестування
Під час тестування одиниць важливо визначити для себе, що ви вважаєте одиницею роботи. В основному: вилучення вашої кодової бази, яка може включати чи не включати кілька методів або класів, що представляє собою єдиний фрагмент функціональності.
Або, як визначено у мистецтві одиничного тестування, 2-е видання Роя Ошерове , стор. 11:
Тест одиниці - це автоматизований фрагмент коду, який викликає одиницю роботи, що перевіряється, а потім перевіряє деякі припущення про єдиний кінцевий результат цього блоку. Тест одиниці майже завжди пишеться за допомогою одиничної рамки тестування. Це можна легко записати і швидко працювати. Це надійно, читабельно та легко ремонтувати. Постійний у своїх результатах, доки виробничий код не змінився.
Важливо усвідомити, що одна одиниця роботи, як правило, не є лише одним методом, але на самому базовому рівні це один метод, а після цього він інкапсульований іншим блоком робіт.
В ідеалі ви повинні мати метод тестування для кожної окремої одиниці роботи, щоб ви завжди могли одразу побачити, де все йде не так. У цьому прикладі є основний метод, getUserById()
який називається, що поверне користувача, і є всього 3 одиниці робіт.
Перший блок роботи повинен перевірити, повертається чи ні дійсний користувач у разі дійсного та недійсного введення.
Тут слід обробляти будь-які винятки, які викидаються з джерела даних: якщо немає користувача, повинен бути тест, який демонструє, що виняток кидається, коли користувача не можна знайти. Зразок цього може бути тим, IllegalArgumentException
що потрапляє в @Test(expected = IllegalArgumentException.class)
анотацію.
Після того, як ви обробляєте всі ваші шаблони використання для цієї основної одиниці роботи, ви переходите на рівень. Тут ви робите точно так само, але ви обробляєте лише винятки, що надходять із рівня прямо нижче поточного. Це підтримує ваш тестовий код добре структурованим і дозволяє вам швидко пройти архітектуру, щоб знайти, де все піде не так, замість того, щоб скакати всюди.
Обробка дійсного та несправного введення тестів
На даний момент має бути зрозуміло, як ми будемо поводитися з цими винятками. Існує 2 типи введення: дійсний вхід і несправний вхід (вхідний в строгому сенсі, але він невірний).
Під час роботи з коректним введенням ви встановлюєте неявну тривалість того, що тест, який ви пишете, буде працювати.
Такий спосіб виклику може виглядати наступним чином : existingUserById_ShouldReturn_UserObject
. Якщо цей метод не вдається (наприклад: викид винятку), знаєте, що щось пішло не так, і ви можете почати копати.
Додавши ще один тест ( nonExistingUserById_ShouldThrow_IllegalArgumentException
), який використовує несправний вхід і очікує винятку, ви можете зрозуміти, чи ваш метод робить те, що він повинен робити з неправильним введенням.
TL; DR
У вашому тесті ви намагалися зробити дві речі: перевірити правильність та несправність введення. Розділивши це на два способи, що кожен робить по одній справі, у вас будуть набагато чіткіші тести та набагато кращий огляд того, де все піде не так.
Маючи на увазі шарувату одиницю робіт, ви також можете зменшити кількість тестів, які вам потрібні для шару, який знаходиться вище в ієрархії, тому що вам не доведеться враховувати кожну річ, яка могла піти не так у нижчих шарах: шари нижче поточного - це віртуальна гарантія того, що ваші залежності працюють, і якщо щось піде не так, це знаходиться у вашому поточному шарі (якщо припустити, що нижчі шари самі не помиляються).