Как мне выполнить модульное тестирование основного метода программы JavaFX? - PullRequest
1 голос
/ 08 апреля 2019

Сейчас я рассматриваю возможность включения 100% покрытия кода в свой проект.Однако у меня возникли проблемы с модульным тестированием основной точки входа в мой код:

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

Этот метод сложно протестировать, поскольку он запускает совершенно новую программу JavaFX в фоновом режиме.В дополнение к этому, программа JavaFX не может быть запущена более одного раза .Более того, в документации для javafx.application.Application прямо говорится, что «Приложение JavaFX не должно пытаться использовать JavaFX после завершения инструментария FX или из ShutdownHook, то есть после метода stop()возвращает или System.exit(int) называется ".

Я сталкиваюсь с этим проектом, потому что я также работаю с TestFX , библиотекой, которая помогает в чистом тестировании для JavaFX.Однако эта библиотека не предлагает поддержку для тестирования основного метода, и в результате я должен написать обходной путь.Существует возможность, что разработчики 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. Как вызывать launch () более одного раза в Java
  2. https://github.com/TestFX/TestFX/blob/master/subprojects/testfx-core/src/main/java/org/testfx/api/FxToolkit.java
...