据我了解,主要问题是异步。在我们从 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 测试模式中找到了更多信息:
由于runnables的队列是先进先出的,runnable被调度在应用程序发布的所有任务之后,当它最终执行时,可以确定AWT事件队列中应用程序的所有延迟任务也都结束了。有关在应用程序代码完成发布到 AWT 事件线程的某些操作时需要等待的测试示例,请参阅 DataEditorSupportTest.java。