我正在做一个相当大的项目,其中包括一组自定义的JavaFX组件。对于每个要重用的自定义组件,我已经开始使用 JemmyFX 和 JUnit 编写一组自动化测试。在开发过程中,我从 Eclipse Juno 内部运行这些。
事实证明,一次运行整套测试很困难。问题似乎源于这样一个事实,因为我想测试多个组件,理想情况下我会为每个组件运行不同的应用程序(以便对一个组件执行的测试不会影响其他测试)。
我创建了一个基类,它执行以下操作:
@BeforeClasspublic 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
测试。当我运行此测试套件时,第一个测试用例运行良好,但其余测试用例失败:
线程"JavaFX Init Thread"中的异常 java.lang.IllegalState异常:不得多次调用应用程序启动
我尝试了以下方法来解决此问题:
关闭应用程序
我在基类中添加了以下内容:
@AfterClasspublic static void afterClass() { Platform.exit();}
同样的问题仍然存在。也许是因为 VM 在测试之间没有重新启动?
防止重新启动应用程序
我放入一个静态变量来检查并查看应用程序是否已经在运行。当我从 Eclipse 运行测试时,这使得问题消失了。当我从命令行运行它们时,问题仍然存在。当我们尝试在集成服务器上运行这些测试时,这不利。
捕获非法状态异常
这是一个奇怪的问题。我可以捕获异常,并且我的大部分问题都消失了,除了整个测试套件 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;
}