我写了一个相当复杂的 JavaFx 2应用程序,我想写一堆单元测试.问题是,当我尝试进行测试时,我得到一个抱怨未初始化工具包的运行时错误. 从我可以告诉我应该以某种方式在@BeforeClass方法
从我可以告诉我应该以某种方式在@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();
}
