有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何对JavaFX程序的主要方法进行单元测试?

现在,我正在考虑将100%的代码覆盖率合并到我的项目中。但是,我在对代码的主要入口点进行单元测试时遇到了问题:

 public static void main(String[] args) {
      launch(args);
 }

这种方法很难测试,因为它在后台启动了一个全新的JavaFX程序。除此之外,JavaFX程序不能启动more than once。此外,documentation for javafx.application.Application明确指出,“JavaFX应用程序不应在FX工具箱终止后或从关闭挂钩(即stop()方法返回或System.exit(int)被调用后)尝试使用JavaFX。”

我遇到这个项目是因为我也在使用TestFX,这是一个帮助JavaFX进行干净测试的库。但是,这个库不支持对main方法的测试,因此我必须编写一个变通方法。TestFX的开发人员可能知道这个问题的可能解决方法,对于每个单元测试的方法,都会启动一个Application的新实例。也许有一种方法可以完全关闭并重置JavaFX程序的所有变量

公平地说,这个方法对测试来说并没有那么重要,但是拥有100%的代码覆盖率是令人愉快的。不测试这种方法是完全合理的。可在下面找到完整类:

package com.meti.app;

import javafx.application.Application;
import javafx.stage.Stage;

/**
 * @author SirMathhman
 * @version 0.0.0
 * @since 4/5/2019
 */ //Main MUST remain public in order for JavaFX Application to start.
public class Main extends Application {
    static InfinityImpl implementation = new Infinity();
    static Main instance;

    @Override
    public void start(Stage primaryStage) {
        instance = this;
        implementation.start(primaryStage);
    }

    @Override
    public void stop() {
        implementation.stop();
        instance = null;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

上面的静态变量与前面提到的问题无关,用于在另一个类中进行测试,以确保委托正确工作。应用程序将大部分操作委托给一个委托类,这使得代码更易于测试

此外,IntelliJ doesn't allow methods to be excluded during code testing. 如果你还有其他问题,请告诉我。谢谢大家!

补充阅读:

  1. How to call launch() more than once in java
  2. https://github.com/TestFX/TestFX/blob/master/subprojects/testfx-core/src/main/java/org/testfx/api/FxToolkit.java

共 (0) 个答案