Simuler un clic de souris pendant le test. JUnit, JavaFX


Dans ma méthode de test, j'essaie de simuler un clic de souris en utilisant la classe 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();
    }
}

Mais la dernière méthode jette des exeptions différentes: parfois c'est NullPointerm mais plus souvent c'est:

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)

Curieusement, mais quand je simule KeyEvent, cela fonctionne parfaitement. De plus, si je supprime la ligne où la touche de la souris est censée être enfoncée, le robot déplace le curseur et aucune exception n'est levée. Je soupçonne que le problème pourrait concerner le thread dans lequel l'application JavaFX fonctionne. Mais je ne peux toujours pas comprendre pourquoi cela ne fonctionne pas.

Author: luator, 2015-07-24

1 answers

Imiter un clic de souris réel sur un bouton est (je pense) considéré comme un non-non (oui j'ai vu des "développeurs" résoudre des problèmes de cette façon dans des problèmes non-JUnit)

La meilleure chose à faire est de dissocier le bouton push evenet et son action: réécrire le clic de bouton afin qu'il invoque une certaine classe qui vous permet d'invoquer exactement le même code de JUnit lui-même. Il y aura une façon différente de plomberie le même code dans l'application réelle et dans le test harnass: la commande invoqué sera le même qui est le but de votre exercice. Il se débarrassera également de cette étrange exception méchante que vous obtenez, ce à quoi vous pouvez vous attendre

 0
Author: André van Kouwen, 2017-11-15 10:01:12