提供样本数据以测试JavaFX GUI

时间:2017-05-15 21:47:23

标签: java javafx

我有一个JavaFX程序,它连接到外部Web API以下载一些数据。我在单元测试中使用模拟测试部分逻辑但现在我想测试GUI,即运行程序并查看下载的数据在放入TableView或ListView时的样子。

public class Main extends Application {
    private MainController mainController;

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/main.fxml"));
        Parent root = fxmlLoader.load();
        mainController = fxmlLoader.getController();
        primaryStage.setTitle("Title");
        primaryStage.setScene(new Scene(root, 600, 550));
        primaryStage.show();
    }

    @Override
    public void stop() {
        mainController.close();
    }
}

我尝试做的是使用Aplication.launch启动应用程序的测试方法,然后调用MainController的方法setApi将默认的API管理器对象替换为小样。不幸的是,我不知道如何访问mainController对象。所以,我的问题是 - 可以做到吗?如果是 - 如何?如果不是 - 用样本数据测试GUI的另一种方法是什么?

1 个答案:

答案 0 :(得分:0)

我将TestFXJBehave结合使用来进行用户界面测试。严格来说,后者对于你的案例来说并不是必需的,你可以用普通的JUnit测试用例做得很好。

在TestFX中,您将获得执行测试的阶段,并将场景传递给它以设置用户界面。

要按照您的示例,您的测试将加载FXML,将root传递给TestFX,然后查询MainController

当你拥有控制器时,你可以操纵它并使用TestFX来模拟点击,按键和验证节点状态。

    @When("the application is closed")
    public void whenTheApplicationIsClosed() throws TimeoutException, InterruptedException {
        clickOn("#filemenu");
        clickOn("#menuitem-quit");
    }

    @Given("a workbench with no changed editors")
    public void givenAWorkbenchWithNoChangedEditors() throws TimeoutException, InterruptedException {
        for (int i = 1; i <= 5; i++) {
            TestEditor editor = new TestEditor(i);
            FxToolkit.setupFixture(() -> workbench.getParts().add(editor));
        }
    }

    @Given("a workbench with a single changed editor")
    public void givenSingleChanged() throws TimeoutException {
        TestEditor testEditor = new TestEditor(1);
        FxToolkit.setupFixture(() -> workbench.getParts().add(testEditor));

        List<Part> parts = workbench.getParts();

        for (int i = 2; i < 5; i++) {
            final Editor editor = new TestEditor(i);
            FxToolkit.setupFixture(() -> parts.add(editor));
        }

        FxToolkit.setupFixture(testEditor::change);
    }

    @Then("a save content dialog is shown")
    public void thenASaveContentDialogIsShown() throws InterruptedException {
        verifyThat(Messages.getString("app.exit.unsavedchanges.header"), NodeMatchers.isVisible());
        clickOn(Messages.getString("app.exit.unsavedchanges.quit"));
    }