我有一个存储XYChart.Series对象的表示类,并通过观察模型来更新它。系列更新使用Platform.runLater(...)
完成我想对此进行单元测试,确保runLater中的命令正确执行。如何告诉unit-test等待runLater命令完成? 现在我所做的就是在测试线程上使用Thread.Sleep(...)来给FXApplicationThread完成时间,但这听起来很愚蠢。
答案 0 :(得分:4)
我解决它的方法如下。
1)创建一个简单的信号量函数,如下所示:
public static void waitForRunLater() throws InterruptedException {
Semaphore semaphore = new Semaphore(0);
Platform.runLater(() -> semaphore.release());
semaphore.acquire();
}
2)每当您需要等待时,请致电waitForRunLater()
。因为Platform.runLater()
(根据javadoc)按照提交的顺序执行runnables,所以你可以在测试中写一下:
...
commandThatSpawnRunnablesInJavaFxThread(...)
waitForRunLater(...)
asserts(...)`
适用于简单测试
答案 1 :(得分:1)
要在AssertJ样式语法中获得更多信息,可以执行以下操作:
@Test
public void test() throws InterruptedException {
// do test here
assertAfterJavaFxPlatformEventsAreDone(() -> {
// do assertions here
}
}
private void assertAfterJavaFxPlatformEventsAreDone(Runnable runnable) throws InterruptedException {
waitOnJavaFxPlatformEventsDone();
runnable.run();
}
private void waitOnJavaFxPlatformEventsDone() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
Platform.runLater(countDownLatch::countDown);
countDownLatch.await();
}
}
答案 2 :(得分:0)
您可以使用在runLater之前创建的CountDownLatch,并在Runnable结束时倒计时