2016-04-24 44 views
1

我有以下測試方法:用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()); 
} 

隨着sleepassertTrue通行證;沒有它就會失敗。

原因很明顯: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執行當然。

人誰知道了很多關於測試能告訴我:

  1. 我應該像這樣做,有一個「任意」睡眠參與?

  2. 有沒有更好的框架或技術來處理這個,我認爲這是一個相當普遍的情況?

  3. 我應該完全避免這種測試嗎? NB我知道這不是「單元測試」,但它是(我認爲)功能測試:「按F3:熱鍵對話框出現」< - 這是應用程序的規範...

回答

0

對於任何人都會遇到這種情況,並對這類東西感興趣,只是以爲我會提煉出我在過去幾天學到的東西。

首先,它看起來的GUI功能測試是後話了「贊成」在最後添加上:首先你使用此應用的膽量......

其次,看來GUI測試是相當具有挑戰性的。

第三,我將取代這個上面的代碼:

App app = new App(); 
    Robot robot = new Robot(); 
    robot.keyPress(KeyEvent.VK_F3); 
    robot.waitForIdle(); 
    EventQueue.invokeAndWait(new Runnable() { 
     @Override 
     public void run() { 
      assertTrue(app.mainFrame.hotkeysDlg.isVisible()); 
     } 
    }); 

...演示如何使用的Robot.waitForIdle() ......也正確(我相信)把知名度的測試中線程的地方屬於,即EDT。無論如何,它似乎工作,這是足夠好,繼續下去!

NB EventQueue.invokeAndWaitEventQueue.invokeLater不太熟悉的兄弟姐妹,但在這樣的測試情況下,它實際上似乎是一種至關重要的:如果你使用invokeLater似乎有很高的概率測試將結束,清理會發生等assertTrue實際運行之前...

相關問題