在测试过程中模拟鼠标单击。JUnit,JavaFX

在测试过程中模拟鼠标单击。JUnit,JavaFX,java,testing,junit,javafx,awtrobot,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(); rob

在我的测试方法中,我尝试使用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();
    }
}
但最后一个方法抛出了不同的示例:有时是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应用程序工作的线程有关。但我还是不明白为什么它不起作用

模仿鼠标点击按钮(我认为)被认为是一个禁忌(是的,我见过“开发人员”以这种方式解决非JUnit问题)


最好的做法是将button push evenet与其操作解耦:重写button click,以便它将调用某个类,该类允许您从JUnit本身调用完全相同的代码。在实际应用程序和测试harnass中,将有一种不同的方法来处理相同的代码:调用的命令将是相同的,这是您练习的目标。它还将消除您得到的奇怪的、令人讨厌的异常,这是您可以预料的

不是将旧AWT与JavaFX混淆了吗?您是否尝试将带有Platform.runLater的AWT任务放在JavaFX线程上?也许有问题?但这只是一个假设,如果您只是想为JavaFX实现测试自动化,那么这可能是一个很好的解决方案。