Prueba JUnit básica para JavaFX 8

Quiero crear una prueba JUnit básica para la aplicación JavaFX 8. Tengo este sencillo ejemplo de código:

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(); } } 

Solo tengo este código hasta el momento:

 import javafx.application.Application; import javafx.stage.Stage; import org.junit.BeforeClass; public class BasicStart extends Application { @BeforeClass public static void initJFX() { Thread t = new Thread("JavaFX Init Thread") { @Override public void run() { Application.launch(BasicStart.class, new String[0]); } }; t.setDaemon(true); t.start(); } @Override public void start(Stage primaryStage) throws Exception { // noop } } 

¿Puede decirme cómo puedo crear la prueba JUnit para el código anterior?

Uso una regla de Junit para ejecutar pruebas unitarias en el hilo JavaFX. Los detalles están en esta publicación . Solo copie la clase de esa publicación y luego agregue este campo a las pruebas de su unidad.

 @Rule public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule(); 

Este código funciona tanto para JavaFX 2 como para JavaFX 8.

El enfoque más fácil es el siguiente:

 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. } } 

¡Espero eso ayude!

Basado en la respuesta de Brian Blonski , creé un JUnit-Testrunner , que básicamente hace lo mismo, pero es un poco más fácil de usar en mi opinión. Al usarlo, su prueba se vería así:

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