我编写了一个相当复杂的 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 {
}
提前致谢!
From 另一个问题 https://stackoverflow.com/questions/11385604/how-do-you-unit-test-a-javafx-controller-with-junit在 stackoverflow 上,我为自己创建了这个小助手类:
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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)