我写了一个相当复杂的 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(); }