4.19 Testing with the Robot

4.19.1 Problem

You want to simulate the user clicking on the mouse or typing with the keyboard using java.awt.Robot.

4.19.2 Solution

We do not recommend this technique.

4.19.3 Discussion

java.awt.Robot allows Java applications to take command of native system input events, such as moving the mouse pointer or simulating keystrokes. At first glance, this seems to be a great way to test your GUIs. Your tests can do exactly what the user might do and then verify that your components are displaying the correct information.

We have found that this approach is dangerous.

  • Robot tests are very fragile, breaking any time the GUI layout changes.

  • If the user moves the mouse while the tests are running, the Robot continues clicking, sometimes on the wrong application.[11]

    [11] One programmer reported that the Robot sent a partially completed email because it clicked on the send button of the mail client instead of a button in the application being tested.

  • Since the tests run so quickly, it can be impossible to stop the tests once the Robot gets confused and starts clicking on other apps and typing characters that show up in other windows.

If you really feel that you could use some Robot tests, consider naming them differently than other tests. You might have a collection of RobotTest*.java tests. You can then run them independently of other tests, if you are extremely careful to avoid touching the mouse while the tests run.

4.19.4 See Also

Chapter 11 provides some references to Swing-specific testing tools.