Ich habe die folgende Testmethode:Was ist der beste Weg, um EDT/Nicht-EDT-Probleme mit JUnit zu behandeln?
@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());
}
Mit den sleep
dieser assertTrue
Pässe; ohne es scheitert es.
Der Grund ist offensichtlich: Robot
, die in einem Nicht-EDT-Thread ausgeführt werden muss, und erzeugt hier eine KeyEvent
, auf die der EDT eine begrenzte Zeit braucht, um darauf zu reagieren.
Die entsprechende Action
ist wie folgt:
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
natürlich im EDT ausgeführt wird.
Kann jemand, der viel über das Testen kennt sagen Sie mir:
soll ich tun es so, mit einem „beliebigen“ Schlaf beteiligt?
Gibt es einen besseren Rahmen oder eine bessere Technik für die Handhabung dieser, die ich vermutet, ist eine ziemlich häufige Situation?
sollte ich diese Art von Tests insgesamt vermeiden? NB Ich bin mir bewusst, das ist nicht "Unit Testing" als solches, aber es ist (glaube ich) Funktionstests: "drücken Sie F3: ein Hotkeys-Dialog erscheint" < - das ist eine Spezifikation der App ...