JavaFXのJUnitテスト

JUnitテストがExceptionInInitializerErrorで失敗する

特にGUI全体をユニットテストしたいわけではないのだが、一部GUI部品を使っているところについてJUnitを作成したいこともある。しかし、例えば以下のように記述すると、

import org.junit.*;
import javafx.scene.control.*;

public class TestfxTest  {
  @Test
  public void test() {
    ContextMenu menu = new ContextMenu();
    menu.getItems().add(new MenuItem("a"));
  }
}

以下のエラーが発生してしまう。

java.lang.ExceptionInInitializerError
    at com.cm55.fx.TestfxTest.test(TestfxTest.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

org.testfxを使う

単純にorg.testfxを使ってみる。gradleであれば以下を追加する。

  testCompile group: 'org.testfx', name: 'testfx-junit', version: '4.0.13-alpha'

あとはJUnitテストにApplicationTestを継承させるだけだ。

import org.junit.*;
import org.testfx.framework.junit.*;
import javafx.scene.control.*;

public class TestfxTest extends ApplicationTest {

  @Test
  public void test() {
    ContextMenu menu = new ContextMenu();
    menu.getItems().add(new MenuItem("a"));
  }
}