我有以下測試方法:用JUnit處理EDT/non-EDT問題的最佳方式是什麼?
@Test public void f3KeystrokeShowsHotkeysDialog() throws AWTException{
App app = new App();
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_F3);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertTrue(app.mainFrame.hotkeysDlg.isVisible());
}
隨着sleep
此assertTrue
通行證;沒有它就會失敗。
原因很明顯:Robot
,它必須在非EDT線程中執行,並且在此處生成EDT需要有限時間響應的KeyEvent
。
相應Action
如下:
ActionMap am = mainFrame.getRootPane().getActionMap();
Action f3Action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("# blip...");
mainFrame.hotkeysDlg.setVisible(true);
}
};
am.put("show hotkeys", f3Action);
... actionPerformed
處於EDT執行當然。
人誰知道了很多關於測試能告訴我:
我應該像這樣做,有一個「任意」睡眠參與?
有沒有更好的框架或技術來處理這個,我認爲這是一個相當普遍的情況?
我應該完全避免這種測試嗎? NB我知道這不是「單元測試」,但它是(我認爲)功能測試:「按F3:熱鍵對話框出現」< - 這是應用程序的規範...