Iniciar com o TestFx

Estou a ter problemas em pôr o TestFx a trabalhar com o aplicativo JavaFx HelloWorld da Oracle.
public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

TestFx junit test:

class MyTest extends GuiTest {
  public Parent getRootNode() {
    return nodeUnderTest;
  }

o que deve nodeUnderTest ser para este exemplo?

Author: gontard, 2014-12-09

2 answers

O TestFx é uma estrutura de teste unit, por isso foi concebido para agarrar partes da sua implementação GUI e testar isso. Isso requer que você disponibilize essas peças em primeiro lugar e teste alvos (botões etc) disponíveis, marcando-os com ids.

GetRootNode () fornece a raiz para os seguintes procedimentos de teste de GUI. No seu exemplo acima da raiz de StackPane pode ser um candidato... mas isso requer que você disponibilize isso para testes para permitir:

 class MyTest extends GuiTest {
     public Parent getRootNode() {
         HelloWorld app = new HelloWorld();
         return app.getRoot(); // the root StackPane with button
     }
 }
Então a aplicação tem que ser modificado para implementar o getRoot(), retornando o StackPane com seu conteúdo para testes, não exigindo o método start ().

O Senhor é capaz de fazer testes sobre isso...

@Test
public void testButtonClick(){
    final Button button = find("#button"); // requires your button to be tagged with setId("button")
    click(button);
    // verify any state change expected on click.
}
 5
Author: Jens-Peter Haack, 2014-12-10 07:59:09

Existe também uma maneira simples de testar toda a sua aplicação. Para se certificar de que o seu aplicativo é inicializado e iniciado corretamente, ele precisa ser iniciado pelo lançador de aplicativos JavaFX. Infelizmente, TestFX não suporta isso fora da caixa (pelo menos eu não encontrei nenhuma maneira de fazer isso), mas você pode facilmente fazer isso subclassing Guitarest:

public class HelloWorldGuiTest extends GuiTest {
  private static final SettableFuture<Stage> stageFuture = SettableFuture.create();

  protected static class TestHelloWorld extends HelloWorld {
    public TestHelloWorld() {
      super();
    }

    @Override
    public void start(Stage primaryStage) throws IOException {
      super.start(primaryStage);
      stageFuture.set(primaryStage);
    }
  }

  @Before
  @Override
  public void setupStage() throws Throwable {
    assumeTrue(!UserInputDetector.instance.hasDetectedUserInput());

    FXTestUtils.launchApp(TestHelloWorld.class); // You can add start parameters here
    try {
      stage = targetWindow(stageFuture.get(25, TimeUnit.SECONDS));
      FXTestUtils.bringToFront(stage);
    } catch (Exception e) {
      throw new RuntimeException("Unable to show stage", e);
    }
  }

  @Override
  protected Parent getRootNode() {
    return stage.getScene().getRoot();
  }

  // Add your tests here

}
 2
Author: Jan Gassen, 2015-01-06 16:54:36