Проверка того, вызывает ли программа Java System.exist без выхода из Junit

Я пытаюсь протестировать программу обработки файлов с помощью Junit. В некоторых случаях программа должна вывести ошибку и завершить работу. Однако использование «System.exit (-1)» приводит к выходу программы из всех тестов Junit. Есть ли способ избежать этого?

Вместо этого я могу напечатать ошибку, а затем return null, однако я нахожу это довольно неэлегантным.

    private List<String> parseData(String[] args){
        if (args.length != 2){
            System.err.println(ERROR + INPUT_ERROR + "\n");
            System.exit(EXIT_CODE);

Есть ли способ проверить, вызвала ли программа «System.exit», не закрывая ее? Спасибо.

Возможный дубликат Предотвращение System.exit() от API

Slawomir Chodnicki 29.05.2019 19:54

Просто сгенерируйте исключение.

Abhijit Sarkar 29.05.2019 20:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
223
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я считаю более неэлегантным использовать System.exit для проверки входных параметров. Почему бы просто не сгенерировать исключение и не позволить обработать его вызывающей стороне этого метода?

Вы правы, спасибо. Это действительно намного элегантнее.

Roy Sht 29.05.2019 20:47

Если речь идет об общении с ОС, то есть для использования в скриптах, исключение вам не поможет. Стандартным способом являются коды выхода, и в таких случаях ИМХО можно проверить, возвращаются ли правильные коды. Коды выхода являются частью опубликованного интерфейса.

Robert 29.05.2019 20:53

Хотя я думаю, что решение AdrianM является идеальным, вы также можете решить это с помощью насмешек.

Вариант первый: используйте фреймворк для имитации, такой как PowerMock, который позволяет вам имитировать статические методы, чтобы вы могли заставить System.exit ничего не делать.

Второй вариант: используйте внедрение зависимости и любой фиктивный фреймворк. Создайте этот интерфейс и класс реализации:

public interface SystemExit {
    void exit(int code);
}

public class SystemExitImpl implements SystemExit {
    public void exit(int code) {
        System.exit(code);
    }
}

Затем сделайте так, чтобы класс, содержащий parseData, принимал SystemExit в качестве параметра конструктора и сохранял его в переменной-члене (или имел сеттер для переменной-члена, который позволяет вам установить его после построения). В производственном коде передайте SystemExitImpl. В своем тесте создайте макет для SystemExit и передайте его вместо этого.

Другие вопросы по теме