java - 使用 JemmyFX 测试多个 JavaFX 组件

标签 java junit javafx-2 jemmy jemmyfx

我正在从事一个相当大的项目,其中包括一组自定义 JavaFX 组件。对于每个要重用的自定义组件,我已经开始使用 JemmyFX 和 JUnit 编写一组自动化测试。在开发过程中,我从 Eclipse Juno 中运行它们。

事实证明,一次运行整套测试非常困难。问题似乎源于这样一个事实,因为我想测试多个组件,理想情况下我会为每个组件运行一个不同的应用程序(以便在一个组件上执行的测试不会影响其他测试)。

我创建了一个执行以下操作的基类:

@BeforeClass
public static void beforeClass() {

    Thread t = new Thread("JavaFX Init Thread") {

        @Override
        public void run() {
            Application.launch(UITester.class, new String[0]);
        }
    };

    t.setDaemon(true);
    t.start();
}

使用这个基类,我为每个自定义控件创建了一个带有 @Test 测试的单独类。当我运行这个测试套件时,第一个测试用例运行良好,但其余的都失败了:

Exception in thread "JavaFX Init Thread" java.lang.IllegalStateException: Application launch must not be called more than once

我尝试了以下方法来解决这个问题:

关闭应用

我在基类中添加了以下内容:

@AfterClass
public static void afterClass() {
    Platform.exit();
}

同样的问题仍然存在。可能是因为 VM 在测试之间没有重新启动?

防止重启应用程序

我放入一个静态变量来检查应用程序是否已经在运行。当我从 Eclipse 运行测试时,这会使问题消失。当我从命令行运行它们时,问题仍然存在。不适合我们尝试在集成服务器上运行这些测试。

捕获 IllegalStateException

这很奇怪。我可以捕捉到异常,我的大部分问题都消失了,除了整个测试套件 Ubuntu 每运行 4 或 5 次就会崩溃到 shell,我必须重新登录。

那么,如何才能最好地为一大套自定义控件编写测试?我的方法不对吗?

最佳答案

查看MarvinFX的来源后我能够以解决我的问题的方式实现我们的测试框架。似乎对解决此问题贡献最大的是为每个测试重建舞台和场景,如以下(伪)代码所示:

@Before
public void before() {
    Node node = generateComponentToTest();
    Parent parent = StackPaneBuilder.create().children(node).build();
    Scene scene = SceneBuilder.create().root(parent).build();

    if (this.currentStage != null) {
        this.currentStage.close();
    }

    Stage stage = new Stage();
    stage.setScene(scene);
    stage.centerOnScreen();
    stage.show();

    this.currentStage = stage;
}

关于java - 使用 JemmyFX 测试多个 JavaFX 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18908552/

相关文章:

java - 如何计算矩阵中每个正方形(较小矩阵)的长度

java - 我的应用程序在尝试直接从 URL 读取时崩溃

java - 如何从静态上下文中引用二维数组?

java - 为什么要使用 Mockito?

java - 仅显示列表中的标签

java - 如何通过从第一个类调用第二个类的方法来调用第三个类的方法

java - 如何从Java中的主类访问src.test包或如何从主类运行测试类?

java - 有没有办法在启动 mvn appengine :devserver? 时不运行单元测试

带有 Java 代码内容荧光笔的 JavaFX 代码编辑器

css - 将 hbox 定位到 javafx gridpane 中单元格的中心