1

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

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

这种方法很难测试,因为它会在后台启动一个全新的 JavaFX 程序。除此行为外,JavaFX 程序不能多次启动。此外,javafx.application.Application 的文档明确指出,“JavaFX 应用程序不应在 FX 工具包终止或从 ShutdownHook 终止后(即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 不允许在代码测试期间排除方法。 如果您有任何其他问题,请告诉我。谢谢!

一些额外的阅读:

  1. 如何在java中多次调用launch()
  2. https://github.com/TestFX/TestFX/blob/master/subprojects/testfx-core/src/main/java/org/testfx/api/FxToolkit.java
4

0 回答 0