私が理解しているように、主な問題は非同期です。テストは、invokeLater() ブロックから結果を取得する前に結果をチェックします。そのため、EDT がコードを実行し、その後チェックするまで待つ必要があります。空の実行可能なブロックを使用して、invokeAndWait メソッドを介して実行できます。Foo クラスの例:
import javax.swing.SwingUtilities;
public class Foo {
private String myLine;
public void executeInEDT(final String line) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
myLine = line;
}
});
}
public String getLine() {
return myLine;
}
}
およびテスト方法:
@Test
public void testInvokeLater() throws InterruptedException, InvocationTargetException {
String testLine = "Test line";
Foo foo = new Foo();
foo.executeInEDT(testLine);
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
// Just for sync
}
});
assertEquals(testLine, foo.getLine());
// And more asserts
}
UPD : Netbeans テストパターンでさらに情報が見つかりました:
ランナブルのキューは FIFO であるため、ランナブルはアプリケーションによってポストされたすべてのタスクの最後にスケジュールされ、最終的に実行されると、AWT イベント キュー内のアプリケーションの遅延タスクもすべて終了したことを確認できます。アプリケーション コードが AWT イベント スレッドにポストされたいくつかのアクションを完了するまで待機する必要があるテストの例については、DataEditorSupportTest.java を参照してください。