在测试期间模拟鼠标单击。 JUnit,JavaFX

时间:2015-07-24 11:44:58

标签: java testing junit javafx awtrobot

在我的测试方法中,我正在尝试使用Robot类模拟鼠标点击:

@Test
public void testMouseEvents(){
    clickMouse();
}

private void clickMouse() {
    final boolean[] flag = {true};
    Platform.runLater(() -> {
        try {
            Robot robot = new Robot();
            robot.mouseMove(900, 500);
            robot.delay(2000);
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            robot.delay(2000);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            robot.delay(2000);
        } catch (Exception ignored) {

        }
        flag[0] = false;
    });

    try {
        while (flag[0]) {
            Thread.sleep(3);
        }
        Thread.sleep(20);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

但是最后一种方法会抛出不同的exeptions:有时它是NullPointerm但更常见的是:

java.util.concurrent.RejectedExecutionException: Task     com.sun.javafx.tk.quantum.PaintRenderJob@24f7eafc rejected from  com.sun.javafx.tk.quantum.QuantumRenderer@14a5ef25[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 4]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)

奇怪的是,当我模拟KeyEvent时,它完美无缺。此外,如果我删除了应该按下鼠标键的行,机器人会移动光标并且不会抛出任何异常。 我怀疑该问题可能涉及JavaFX应用程序工作的线程。但我仍然无法弄清楚为什么它不起作用。

1 个答案:

答案 0 :(得分:0)

模仿实际鼠标点击按钮是(我认为)认为是禁忌(是的,我已经看过"开发人员"在非JUnit问题中以这种方式解决问题)

要做的最好的事情是解除按钮按下evenet及其动作:重写按钮单击以便它将调用某个类,允许您从JUnit本身调用完全相同的代码。在实际应用程序和测试中,将使用不同的方法来管理相同的代码:调用的命令将与练习的目标相同。它也将摆脱你得到的那种奇怪的令人讨厌的异常