JavaFX8的基本JUnit测试

JavaFX8的基本JUnit测试,junit,javafx-2,javafx,junit4,javafx-8,Junit,Javafx 2,Javafx,Junit4,Javafx 8,我想为JavaFX8应用程序创建基本的JUnit测试。我有一个简单的代码示例: public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTit

我想为JavaFX8应用程序创建基本的JUnit测试。我有一个简单的代码示例:

public class Main extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Tabs");
        Group root = new Group();
        Scene scene = new Scene(root, 400, 250, Color.WHITE);
        TabPane tabPane = new TabPane();
        BorderPane borderPane = new BorderPane();
        for (int i = 0; i < 5; i++) {
            Tab tab = new Tab();
            tab.setText("Tab" + i);
            HBox hbox = new HBox();
            hbox.getChildren().add(new Label("Tab" + i));
            hbox.setAlignment(Pos.CENTER);
            tab.setContent(hbox);
            tabPane.getTabs().add(tab);
        }
        // bind to take available space
        borderPane.prefHeightProperty().bind(scene.heightProperty());
        borderPane.prefWidthProperty().bind(scene.widthProperty());

        borderPane.setCenter(tabPane);
        root.getChildren().add(borderPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

您能告诉我如何为上述代码创建JUnit测试吗?

最简单的方法如下:

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.stage.Stage;

import org.junit.Test;

public class BasicStart {

    @Test
    public void testA() throws InterruptedException {
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                new JFXPanel(); // Initializes the JavaFx Platform
                Platform.runLater(new Runnable() {

                    @Override
                    public void run() {
                        new Main().start(new Stage()); // Create and
                                                        // initialize
                                                        // your app.

                    }
                });
            }
        });
        thread.start();// Initialize the thread
        Thread.sleep(10000); // Time to use the app, with out this, the thread
                                // will be killed before you can tell.
    }

}

希望有帮助

最简单的方法如下:

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.stage.Stage;

import org.junit.Test;

public class BasicStart {

    @Test
    public void testA() throws InterruptedException {
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                new JFXPanel(); // Initializes the JavaFx Platform
                Platform.runLater(new Runnable() {

                    @Override
                    public void run() {
                        new Main().start(new Stage()); // Create and
                                                        // initialize
                                                        // your app.

                    }
                });
            }
        });
        thread.start();// Initialize the thread
        Thread.sleep(10000); // Time to use the app, with out this, the thread
                                // will be killed before you can tell.
    }

}

希望有帮助

我使用Junit规则在JavaFX线程上运行单元测试。详情见附件。只需从那篇文章中复制类,然后将此字段添加到单元测试中

@Rule public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule();

这段代码适用于JavaFX2和JavaFX8。

我使用Junit规则在JavaFX线程上运行单元测试。详情见附件。只需从那篇文章中复制类,然后将此字段添加到单元测试中

@Rule public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule();
这段代码适用于JavaFX2和JavaFX8。

基于我创建的,基本上做了相同的事情,但在我看来使用起来更简单。 使用它,您的测试将如下所示:

@RunWith( JfxTestRunner.class )
public class MyUnitTest
{
  @Test
  public void testMyMethod()
  {
   //...
  }
}
基于的,我创建了一个,它基本上做了相同的事情,但在我看来使用起来更简单。 使用它,您的测试将如下所示:

@RunWith( JfxTestRunner.class )
public class MyUnitTest
{
  @Test
  public void testMyMethod()
  {
   //...
  }
}

我建议使用JemmyFX——设置和习惯它需要一些时间和精力,但它非常强大。如果你从头开始,你可能会花费大量的时间和精力去做一些不太好的事情。我建议你使用JemmyFX-设置和习惯它需要一些时间和精力,但它非常强大。如果你从头开始,你可能会花很多时间和精力做一些不太好的事情。如果可以的话,我会尽量避免使用Thread.sleep()。很少的测试并不是什么大问题,但是当你有数百个测试时,它会减慢速度。看看是否可以改用某种闩锁。目前看来,使用正常的JUnit报告机制,这似乎不会报告失败的断言(在
run
内部),因为
Runnable
无法传播
异常
。如果可以,我会避免使用Thread.sleep()。很少的测试并不是什么大问题,但是当你有数百个测试时,它会减慢速度。看看是否可以改用某种闩锁。目前看来,这似乎不会使用正常的JUnit报告机制报告失败的断言(在
run
),因为
Runnable
无法传播
异常
。这非常有效,但是在线程上运行测试意味着您不能有任何睡眠或等待,也不能有任何使用平台的代码。runLater无法测试-除非您能建议解决方法?@Adam为什么您不能使用任何睡眠或等待?通常不建议在单元测试中使用它们,但我不明白如果您真的需要,为什么您不能使用它们。如果您想使用Platform.runLater(),那么您可以在主线程上运行,否则,如果您已经在javafx线程上,为什么需要调用Platform.runLater()?为了更好地解释。。。。我在这里谈论的是集成测试,不是真正的单元测试,尽管使用的是JUnit。如果显示是从另一个线程更新的,比如说网络客户端,则必须使用Platform.runLater(runnable),但是,在测试(在fx线程上运行)完成并将控制权返回给主fx线程之后,才会执行runnable,然后主fx线程将为队列中的下一个作业提供服务。@Adam啊,没错。junit测试在javafx线程有机会运行之前退出。集成测试总是很棘手,但对于这种情况,我认为您可以利用javafx线程代码将按顺序运行的优势。创建并锁定互斥体,调用Platform.runLater()代码,然后在另一个Platform.runLater()块中释放互斥体,该块在第一个平台之后运行。然后让您的测试在互斥锁上等待。您可能还想查看用于集成测试的GUI测试工具,如Jemmy或TestFX。我听说您可以使用异步测试验证。此解决方案与PowerMock冲突!一旦您将此规则包括到JUnit测试中,该测试被注释为与
PowerMockRunner
一起运行,您就会在线程“AWT-EventQueue-0”中得到
异常java.lang.RuntimeException:java.lang.UnsatisfiedLinkError:Native Library libglass.so已经加载到另一个类加载器中
这可以很好地工作,但是在线程上运行测试意味着你不能有任何睡眠或等待,也不能测试任何使用platform.runLater的代码-除非你能提出解决方案?@Adam为什么要这样做您不能使用任何睡眠或等待吗?通常不建议在单元测试中使用它们,但我不明白如果您真的需要,为什么您不能使用它们。如果您想使用Platform.runLater(),那么您可以在主线程上运行,否则,如果您已经在javafx线程上,为什么需要调用Platform.runLater()?为了更好地解释。。。。我在这里谈论的是集成测试,不是真正的单元测试,尽管使用的是JUnit。如果显示是从另一个线程更新的,比如说网络客户端,则必须使用Platform.runLater(runnable),但是,在测试(在fx线程上运行)完成并将控制权返回给主fx线程之后,才会执行runnable,然后主fx线程将为队列中的下一个作业提供服务。@Adam啊,没错。junit测试在javafx线程有机会运行之前退出。集成测试总是很棘手,但对于这种情况,我认为您可以利用javafx线程代码将按顺序运行的优势。创建并锁定互斥体,调用Platform.runLater()代码,然后在另一个Platform.runLater()块中释放互斥体,该块在第一个平台之后运行。然后让您的测试在互斥锁上等待。您可能还想查看用于集成测试的GUI测试工具,如Jemmy或TestFX。我听说您可以使用异步测试验证。此解决方案与PowerMock冲突!一旦您将此规则包含到JUnit测试中,并注释为使用
PowerMockRunner
运行,您就会在线程“AWT-EventQueue-0”java.lang.Runt中获得
异常