Использование системных правил для перехвата System.exit() не работает с окнами Swing
Мне поручено настроить некоторые тесты JUnit для служебного приложения, которое требуется для System.exit(1) при различных обстоятельствах, и System Rules отлично подходит для тестирования этого. Приложение также может работать в режиме графического интерфейса и выдает небольшой JFrame. Когда он выполняется в контексте теста JUnit с примененным правилом ExpectedSystemExit, когда создается JFrame, что-то незаметно выходит из jvm. Отключите правило ExpectedSystemExit, и тест запустится, как и должно, просто вытащив JFrame, просто я больше не могу проверять jvm exit()s.
Можно предположить, что введенные в Системные правила SecurityManager 1.9.0 некоторые разрешения запрещены. Я все еще в процессе сбора дополнительной отладочной информации. До тех пор, есть ли известное решение этой проблемы?
1 ответ
setDefaultCloseOperation
звонки SecurityManager.checkExit
проверять exit
можно назвать. Правила системы основаны на SecurityManager
и интерпретирует это как призыв к exit
, Это приведет к сбою вашего теста и сделает невозможным создание ваших окон awt.
Вы должны создать свои окна и позвонить setDefaultCloseOperation
до ExpectedSystemExit
регистры SecurityManager
, Например в @BeforeClass
метод:
@Rule
public ExpectedSystemExit exit = ExpectedSystemExit.none();
static JFrame frame;
@BeforeClass
public static void before() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
@Test
public void test() {
exit.expectSystemExitWithStatus(0);
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}