Я пытаюсь протестировать программу обработки файлов с помощью 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 для проверки входных параметров. Почему бы просто не сгенерировать исключение и не позволить обработать его вызывающей стороне этого метода?
Вы правы, спасибо. Это действительно намного элегантнее.
Если речь идет об общении с ОС, то есть для использования в скриптах, исключение вам не поможет. Стандартным способом являются коды выхода, и в таких случаях ИМХО можно проверить, возвращаются ли правильные коды. Коды выхода являются частью опубликованного интерфейса.
Хотя я думаю, что решение 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
и передайте его вместо этого.
Возможный дубликат Предотвращение System.exit() от API