Базовый тест JUnit для JavaFX 8
Я хочу создать базовый тест JUnit для приложения JavaFX 8. У меня есть этот простой пример кода:
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();
}
}
У меня есть только этот код:
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
}
}
Можете ли вы рассказать мне, как я могу создать тест JUnit для вышеуказанного кода?
Ответы
Ответ 1
Я использую правило Junit для запуска модульных тестов в потоке JavaFX. Подробности находятся в этот пост. Просто скопируйте класс из этого сообщения, а затем добавьте это поле в свои модульные тесты.
@Rule public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule();
Этот код работает как для JavaFX 2, так и для JavaFX 8.
Ответ 2
Самый простой aproach следующий:
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.
}
}
Надеюсь, что это поможет!
Ответ 3
На основе Брайан Блонски answer Я создал JUnit-Testrunner, что делает практически то же самое, но, на мой взгляд, немного проще использовать.
Используя это, ваш тест будет выглядеть следующим образом:
@RunWith( JfxTestRunner.class )
public class MyUnitTest
{
@Test
public void testMyMethod()
{
//...
}
}