我有一个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的另一种方法是什么?
答案 0 :(得分:0)
我将TestFX与JBehave结合使用来进行用户界面测试。严格来说,后者对于你的案例来说并不是必需的,你可以用普通的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"));
}