gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:06 25 4
gpt4 key购买 nike

我有以下测试方法:

@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 线程中执行)生成一个 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. 我应该这样做,并涉及“任意” sleep 吗?

  2. 是否有更好的框架或技术来处理这个问题,我 假设这是一种相当普遍的情况?

  3. 我应该完全避免这种测试吗?注意,我知道这不是“单元测试”本身,但它是(我认为)功能测试:“按 F3:出现热键对话框”<-- 这是应用程序的规范...

最佳答案

对于任何遇到此问题并对此类内容感兴趣的人来说,我想我会总结我在过去几天中学到的东西。

首先,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 实际运行之前,测试很可能会结束,并且会发生清理等...

关于java - 使用 JUnit 处理 EDT/非 EDT 问题的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36822756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com