Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JemmyFX测试多个JavaFX组件_Java_Junit_Javafx 2_Jemmy_Jemmyfx - Fatal编程技术网

使用JemmyFX测试多个JavaFX组件

使用JemmyFX测试多个JavaFX组件,java,junit,javafx-2,jemmy,jemmyfx,Java,Junit,Javafx 2,Jemmy,Jemmyfx,我正在从事一个相当大的项目,其中包括一组自定义JavaFX组件。对于每个要重用的自定义组件,我已经开始使用JemmyFX和JUnit编写一组自动化测试。在开发过程中,我从EclipseJuno内部运行这些 事实证明,一次运行整个测试套件是困难的。这个问题似乎源于这样一个事实,因为我想测试多个组件,所以理想情况下,我会为每个组件运行不同的应用程序(以便在一个组件上执行的测试不会影响其他测试) 我创建了一个基类,它执行以下操作: @BeforeClass public static void bef

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

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

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

@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(); } 我尝试了以下方法来解决这个问题:

关闭应用程序 我在基类中添加了以下内容:

@AfterClass public static void afterClass() { Platform.exit(); } @下课 公共静态void afterClass(){ Platform.exit(); } 同样的问题依然存在。可能是因为VM在测试之间没有重新启动

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

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


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

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


现在不在我的电脑上,但我认为JemmyFx有一个特殊的类(AppExecutor?)来运行应用程序-这可能会解决您的问题。或者,您可以在一个新的VM中运行每个测试类(junit可能有一个参数来执行该操作),但会显示出来。@assylias yes,
AppExecutor.executeNoBlock(UITester.class)
据我所知,它与我的原始样本做了相同的事情(这是我最初为启动测试而做的调用,具有相同的效果)。我只是偶然发现了一种很有希望的方法来完成我正在尝试的工作。我也有同样的问题。在等待更好的解决方案时,我只在每个测试类中放置一个测试方法。在CI上,每个测试都在单独的jvm中运行。对于eclipse,我使用相同的解决方案(静态标志)。 @AfterClass public static void afterClass() { Platform.exit(); }
@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;
}