Тестирование, если Java-программа вызывает System.exist - без выхода из Junit - PullRequest
1 голос
/ 29 мая 2019

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

Ответы [ 2 ]

4 голосов
/ 29 мая 2019

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

1 голос
/ 29 мая 2019

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

Вариант 1: используйте фальшивый фреймворк, такой как 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 и передайте его вместо этого.

...