Задать вопрос
@username5

Как написать тест с ожидаемым исключением в junit (java)?

Доброго времени суток.
Подскажите пожалуйста, как написать тест в junit - ловлю ожидаемое исключение

Исходный код метода:
private ArrayList<String> parseURL(ArrayList<String> urls) throws ServerException {
        ArrayList<String> urlsAndTexts = new ArrayList<>();
        if(urls == null) {
            return urlsAndTexts;
        }

        Document htmlDocument = null;

        for(String url : urls) {
            String bodyTagText;

            if(!url.contains("https://")) {
                url = "https://" + url;
            }
            try {
                htmlDocument = Jsoup.connect(url).get();
            } catch (SocketException e) {
                throw new ServerException("Invalid url parsing: " + url, e);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                bodyTagText = htmlDocument.body().text();
            } catch (NullPointerException e) {
                bodyTagText = null;
            }
            urlsAndTexts.add(bodyTagText);
        }
        return urlsAndTexts;
    }


Пытаюсь написать unit-тест, где ожидаю исключение ServerException
@Test
    void whenParseNotUrls_thenReturnException() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<String> urls = new ArrayList<>();
        urls.add("123");
        urls.add("abc");
        urls.add("абв");

        Method method = URLService.class.getDeclaredMethod("parseURL", ArrayList.class);
        method.setAccessible(true);
        ArrayList<String> strings = (ArrayList<String>)method.invoke(urlService, urls);
        ServerException thrown = Assertions.assertThrows(ServerException.class() -> {
            //Code under test
        });
        Assertions.assertEquals("some message", exception.getMessage());
    }

Никак не могу побороть синтаксис junit + mockito. Можете подсказать, как будет правильно. А я по аналогии сделаю другие тесты
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Средний 5 комментариев
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
1. Не нужно тестировать private методы, выковыривая их через рефлексию. Они для того и private чтобы скрыть реализацию.

2. Там где у вас написано //Code under test как раз должен быть "код, который вы тестируете. Т.е. там нужно вызвать метод, который предполагаемо выбросит эксепшен.
Вот тут еще можно глянуть пример: https://www.baeldung.com/junit-assert-exception#junit-5
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы