2015-04-23 2 views
0

Мне поручено настроить некоторые тесты JUnit для приложения-утилиты, которое требуется для System.exit (1) при различных обстоятельствах, и System Rules отлично подходит для тестирование. Приложение также может работать в режиме графического интерфейса, и оно выдает небольшой JFrame. Когда он выполняется в контексте теста JUnit с применяемым правилом ExpectedSystemExit, по мере создания JFrame что-то скрытно выходит из jvm. Выключите правило ExpectedSystemExit, и тест будет выполняться так, как должен, выталкивая JFrame просто отлично, я просто не могу тестировать jvm exit() s.Использование системных правил для перехвата System.exit() не выполняется с помощью окон Swing

Догадка заключается в том, что системные правила SecurityManager 1.9.0 устанавливаются на место - это запрещение некоторых разрешений. Я все еще собираюсь собирать дополнительную информацию об отладке. До тех пор, есть ли известное решение этой проблемы?

+1

Вы ссылающийся 'setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)'? Он вызывает 'SecurityManager.checkExit', которые системные правила интерпретируют как' exit() '. –

+0

@Banthar Действительно, дальнейшая отладка показывает, что 'setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)' запускает exit(). Ну что теперь? –

ответ

0

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)); 
} 
+0

Это потребует изменения приложения, чтобы положить его в крючок после построения JFrame. Я надеялся на решение in situ. –

+0

Вы можете написать собственный 'SecurityManager', который будет действовать по-разному при вызове из' setDefaultCloseOperation'. –