JavaFX8的基本JUnit测试
我想为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
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中获得异常