1

現在、100% のコード カバレッジをプロジェクトに組み込むことを検討しています。ただし、コードのメイン エントリ ポイントの単体テストに問題があります。

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

このメソッドは、まったく新しい JavaFX プログラムをバックグラウンドで起動するため、テストが困難です。この動作に加えて、JavaFX プログラムは複数回開始できません。さらに、javafx.application.Application のドキュメントには、「JavaFX アプリケーションは、FX ツールキットが終了した後、または ShutdownHook から、つまりstop()メソッドが返された後、またはメソッドSystem.exit(int)が呼び出された後、JavaFX を使用しようとしないでください」と明示的に記載されています。

JavaFX のクリーンなテストに役立つライブラリであるTestFXも使用しているため、このプロジェクトに遭遇しています。ただし、このライブラリはメイン メソッドのテストをサポートしていないため、回避策を作成する必要があります。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