Создайте фиктивный класс, который упаковывает System.exit ()
Я согласен с EricSchaefer . Но если вы используете хороший фреймворк, такой как Mockito , то достаточно простого конкретного класса, не нужно интерфейса и двух реализаций.
Остановка выполнения теста в System.exit ()
Проблема:
// do thing1
if(someCondition) {
System.exit(1);
}
// do thing2
System.exit(0)
Насмешливый Sytem.exit()
не прекратит выполнение. Это плохо, если вы хотите проверить, что thing2
не выполняется.
Решение:
Вы должны изменить этот код в соответствии с рекомендациями martin :
// do thing1
if(someCondition) {
return 1;
}
// do thing2
return 0;
И сделать System.exit(status)
в вызывающей функции. Это заставляет вас иметь все ваши System.exit()
s в одном месте в или около main()
. Это чище, чем звонить System.exit()
глубоко внутри вашей логики.
Код
Wrapper:
public class SystemExit {
public void exit(int status) {
System.exit(status);
}
}
Main:
public class Main {
private final SystemExit systemExit;
Main(SystemExit systemExit) {
this.systemExit = systemExit;
}
public static void main(String[] args) {
SystemExit aSystemExit = new SystemExit();
Main main = new Main(aSystemExit);
main.executeAndExit(args);
}
void executeAndExit(String[] args) {
int status = execute(args);
systemExit.exit(status);
}
private int execute(String[] args) {
System.out.println("First argument:");
if (args.length == 0) {
return 1;
}
System.out.println(args[0]);
return 0;
}
}
Тест:
public class MainTest {
private Main main;
private SystemExit systemExit;
@Before
public void setUp() {
systemExit = mock(SystemExit.class);
main = new Main(systemExit);
}
@Test
public void executeCallsSystemExit() {
String[] emptyArgs = {};
// test
main.executeAndExit(emptyArgs);
verify(systemExit).exit(1);
}
}