当前位置 : 主页 > 网络安全 > 测试自动化 >

单元测试 – 使用TestNG对JavaFx 2应用程序进行单元测试

来源:互联网 收集:自由互联 发布时间:2021-06-19
我写了一个相当复杂的 JavaFx 2应用程序,我想写一堆单元测试.问题是,当我尝试进行测试时,我得到一个抱怨未初始化工具包的运行时错误. 从我可以告诉我应该以某种方式在@BeforeClass方法
我写了一个相当复杂的 JavaFx 2应用程序,我想写一堆单元测试.问题是,当我尝试进行测试时,我得到一个抱怨未初始化工具包的运行时错误.

从我可以告诉我应该以某种方式在@BeforeClass方法中调用Application.launch()但这会导致死锁,因为Application.launch()不会返回到调用线程.

那么问题是我应该如何初始化JavaFx?

这是代码的骨架不起作用:

public class AppTest extends Application {

    @BeforeClass
    public void initialize() {
        launch(); //this causes a deadlock
    }

    @Test
    public void test1() {
        //conduct test here
    }

    @Test
    public void test2() {
        //conduct other test here
    }

    @Override
    public void start(Stage arg0) throws Exception {
    }

提前致谢!

从堆栈溢出的 another question开始,我自己做了这个小助手类:

import javafx.application.Application;
import javafx.stage.Stage;

public class JavaFXInitializer extends Application {

    private static Object barrier = new Object();

    @Override
    public void start(Stage primaryStage) throws Exception {
        synchronized(barrier) {
            barrier.notify();
        }
    }

    public static void initialize() throws InterruptedException {
        Thread t = new Thread("JavaFX Init Thread") {
            public void run() {
                Application.launch(JavaFXInitializer.class, new String[0]);
            }
        };
        t.setDaemon(true);
        t.start();      
        synchronized(barrier) {
            barrier.wait();
        }
    }
}

然后可以在@BeforeClass安装方法中轻松使用:

@BeforeClass
public void setup() throws InterruptedException {
    JavaFXInitializer.initialize();
}
网友评论