在Eclipse photon和fx9或fx11中使用TestFX 4.0.14(无关紧要),来自TestFX Wiki的simple example testshould_click_on_button()中失败,

Expected: Labeled has text "clicked!"
         but: was "click me!"

当查看屏幕时,将显示 Pane 及其包含的按钮,但是鼠标会移动到其他地方:因此,永远不会单击该按钮,因此其文本也不会改变。

知道有什么问题/如何解决吗?

测试代码(为方便起见,均从Wiki复制):
import org.junit.Test;
import org.testfx.framework.junit.ApplicationTest;

import static org.testfx.api.FxAssert.*;
import static org.testfx.matcher.control.LabeledMatchers.*;

import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 * Simple testfx example from testfx wiki:
 * https://github.com/TestFX/TestFX/wiki/Getting-Started
 *
 */
public class ClickApplicationTest extends ApplicationTest {
    @Override
    public void start(Stage stage) {
        Parent sceneRoot = new ClickApplication.ClickPane();
        Scene scene = new Scene(sceneRoot, 100, 100);
        stage.setScene(scene);
        stage.show();
    }

    @Test
    public void should_contain_button() {
        // expect:
        verifyThat(".button", hasText("click me!"));
    }

    @Test
    public void should_click_on_button() {
        // when:
        clickOn(".button");

        // then:
        verifyThat(".button", hasText("clicked!"));
    }


}

应用代码:
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 * Simple testfx example from testfx wiki:
 * https://github.com/TestFX/TestFX/wiki/Getting-Started
 *
 */
public class ClickApplication extends Application {
    // application for acceptance tests.
    @Override public void start(Stage stage) {
        Parent sceneRoot = new ClickPane();
        Scene scene = new Scene(sceneRoot, 100, 100);
        stage.setScene(scene);
        stage.show();
    }

    // scene object for unit tests
    public static class ClickPane extends StackPane {
        public ClickPane() {
            super();
            Button button = new Button("click me!");
            button.setOnAction(actionEvent -> button.setText("clicked!"));
            getChildren().add(button);
        }
    }
}

更新:

TestFX中发现了一个可能匹配的未解决问题。它提到了一个core fx bug,这可能是原因-但似乎不是:它已在fx11中修复(已验证核心错误报告中的代码已通过),但testfx问题仍然存在..

最佳答案

这个对我有用。

无论如何,您可能会在UI更改发生之前检查它,因为它是在FX Application线程中完成的,而不是在执行测试的线程中完成的。

使用此行

WaitForAsyncUtils.waitForFxEvents()

clickOnverifyThat调用之间。

10-04 13:09