2017-06-19 11 views
0

夜間の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の更新がいつ行われるかを示す適切な方法は何ですか?

+0

['AutoWaitForIdle'](https://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html#setAutoWaitForIdle(boolean))をonに設定してみましたか? –

+0

AutoWaitForIdleとwaitForIdle()を手動で呼び出す方法の違いがわかりません。 –

+0

おそらくそうではありません、ただの野生の推測です。 –

答えて

0

私はSunToolkit.realSync()を使用する必要があり、Java 9でも正しく動作しているようです。

Robot.waitForIdle()とSwingUntilities.invokeLater()はJava EventThreadが作業を終了するまでrealSync()がすべてのグラフィック関連スレッドを待機するように見えますが、確かな証拠は見つかりませんでした。

誰かがより良い答えを出してくれたら、私は答えではなくそのことを受け入れるつもりです。

+0

今日、Java 1.7 realSync()の下で、私の答えを受け入れていません。なぜ私がコードに目に見えないのか分かりません。 –

関連する問題