6

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

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

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

@课前
公共静态无效 beforeClass() {

    线程 t = new Thread("JavaFX 初始化线程") {

        @覆盖
        公共无效运行(){
            Application.launch(UITester.class, new String[0]);
        }
    };

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

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

线程“JavaFX Init Thread”java.lang.IllegalStateException 中的异常:不能多次调用应用程序启动

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

关闭应用程序

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

@下课以后
公共静态无效后类(){
    平台.exit();
}

同样的问题仍然存在。也许是因为虚拟机在测试之间没有重新启动?

防止重新启动应用程序

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

捕获 IllegalStateException

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

那么,如何最好地为大量自定义控件编写测试?我的方法不正确吗?

4

1 回答 1

3

在查看了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;
}
于 2013-09-30T20:36:28.217 回答