Я пытаюсь протестировать программу обработки файлов с помощью 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», не закрывая ее? Спасибо.

1
Roy Shtoyerman 29 Май 2019 в 20:52

2 ответа

Лучший ответ

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

4
AdrianM 29 Май 2019 в 17:58

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

Вариант первый: использовать фальшивую платформу, такую как PowerMock, которая позволяет вам макетировать статические методы, чтобы вы могли создавать {{ X0}} ничего не делать.

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

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

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

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

1
Aasmund Eldhuset 29 Май 2019 в 19:26