夜間のUIテストで頻繁にタイミングの問題が発生しています。 java.awt.Robotによって実行されるイベントは、テストコードが結果の検証を試みる前に完了していないため、テストは失敗することがよくあります。java.awt.Robot.waitForIdle()は実現不可能
我々は使用してのようなコードです:
Point p = cb.getLocationOnScreen();
int m = 5;
if (cb.getWidth()<5||cb.getHeight()<5)
m=3;
System.out.println("Click at " + (p.x+m) + "," + (p.y+m));
robot.mouseMove(p.x + m, p.y + m);
robot.mousePress(MouseEvent.BUTTON1_MASK);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
robot.waitForIdle();
Thread.sleep(100);
// Verify results...
我々は、Javaにもかかわらず、イベントスレッド上で完全なもの(ボタンをクリックするか、テキストを入力するようなもの)を確保するためのThread.sleepアップバンプを持っておきます。 awt.Robot.waitForIdle()呼び出し。
java.awt.Toolkit.realSync()を使用するというこの質問(Does java.awt.Robot.waitForIdle() wait for events to be dispatched?)が見つかりましたが、これはアクセス可能なメソッドではなく、Java 9が登場すると、テストに不要なリフレクションを追加したくない。
もっと良い解決策はありますか?あるいは、realSync()を使うか、テストが確実に成功するまで待ち時間を増やすだけですか?
UPDATE
I)は、(sun.awt.SunToolkit.realSyncを使用してみましたが、それはいくつかのテストにぶら下がって、決して返しています。 EventThreadが境界線などをペイントしているようです。
私の唯一の解決策は、テストが実際に確実に成功するまでスリープ時間をバンプすることです。ヤック
UPDATE 2
私は)最初は、私はrealSync(としていたハング考え出しました。私たちのコードでは、いくつかのペイントコードがgetメソッドと呼ばれ、別のペイントを待ち行列に入れたsetメソッドを呼び出すという問題がありました。永遠に繰り返す。
コードを修正し、realSync()をしばらく使っていました。それはまだ前に戻っているようです。なぜ、私は回避策がありません。
また、私はrealSync()がJava 1.7で動作するLinuxボックスでハングしてタイムアウトしているのを見ましたが、Java 1.8でも動作します。ここでは非常に信頼性の高いツールです。/s
元の質問に戻る。 UIの更新がいつ行われるかを示す適切な方法は何ですか?
['AutoWaitForIdle'](https://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html#setAutoWaitForIdle(boolean))をonに設定してみましたか? –
AutoWaitForIdleとwaitForIdle()を手動で呼び出す方法の違いがわかりません。 –
おそらくそうではありません、ただの野生の推測です。 –