在单元测试中等待Platform.RunLater

时间:2014-04-02 19:26:10

标签: java unit-testing javafx-2 javafx-8

我有一个存储XYChart.Series对象的表示类,并通过观察模型来更新它。系列更新使用Platform.runLater(...)

完成

我想对此进行单元测试,确保runLater中的命令正确执行。如何告诉unit-test等待runLater命令完成? 现在我所做的就是在测试线程上使用Thread.Sleep(...)来给FXApplicationThread完成时间,但这听起来很愚蠢。

3 个答案:

答案 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结束时倒计时