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