Использование системных правил для перехвата 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));
}
Другие вопросы по тегам