4

私はかなり複雑な 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 {
    }

前もって感謝します!

4

3 に答える 3

0

JavaFX アプリがproject-root/src/main/java/package/FXApp.java にある場合、テストは project-root/src/test/java/package/FXAppTest などの別の場所にある可能性があります。ジャバ 。この場合、 FXAppTest クラスは、 BeforeClass を使用して初期化することで FXApp クラスを呼び出すことができます。

理論的には、次のような方法で FX アプリを開始できるはずです。

// imports located here that import junit 4.11+ packages (or TestNG)
public class FXAppTest {
@BeforeClass
public void initialize() {
   FXApp fxa = new FXApp();
   while ( fxa.isLoading() ) {
      // do nothing
   }
}
....

注: FXAppTest はここで Application を拡張しないことに注意してください。

これで問題の原因がわからない場合は、JVM で JMX 引数を有効にしてから、ロックされたスレッドを JVisualVM で表示できます。

于 2012-11-20T21:10:55.827 に答える