使用JUnit处理EDT /非EDT问题的最佳方法是什么?

时间:2016-04-24 11:54:50

标签: java junit event-dispatch-thread

我有以下测试方法:

@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线程中执行,并在此处生成KeyEvent,EDT需要有限的时间来响应。

相应的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:热键对话框出现”< - 这是应用程序的规范...

1 个答案:

答案 0 :(得分:0)

对于遇到这种情况并对这类东西感兴趣的人,我以为我会提炼过去几天我所学到的东西。

首先,看起来GUI功能的测试是“专业人士”在最后添加的东西:首先你得到应用程序的工作......

其次,GUI测试似乎非常具有挑战性。

第三,我将用以下代码替换上面的代码:

<base href="http://www.mywebsite.com/images/" target="_blank">

...演示 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()); } }); 的使用......并且正确地(我相信)在其所属的线程中对可见性进行测试,即EDT。无论如何,它似乎工作,这足以让你继续!

NB Robot.waitForIdle()EventQueue.invokeAndWait不太熟悉的兄弟姐妹,但在这样的测试环境中,它实际上似乎有点关键:如果你使用EventQueue.invokeLater似乎很有可能在invokeLater实际运行......

之前,测试将结束,清理将发生等