我正在从事一个相当大的项目,其中包括一组自定义 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/