Я хотел бы написать тест для класса TornadoFX ItemViewModel, но как только я пытаюсь присвоить значение свойству элемента, я получаю следующее исключение:
Exception in thread "main" java.lang.IllegalStateException: Toolkit not initialized
at javafx.graphics/com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:410)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:405)
at javafx.graphics/javafx.application.Platform.runLater(Platform.java:150)
at tornadofx.FX$Companion.runAndWait(FX.kt:229)
at tornadofx.ViewModel.rollback(ViewModel.kt:266)
at tornadofx.ViewModelKt$rebindOnChange$2.changed(ViewModel.kt:369)
at javafx.base/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:360)
at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.base/javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:106)
at javafx.base/javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:113)
at javafx.base/javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147)
at javafx.base/javafx.beans.property.ObjectProperty.setValue(ObjectProperty.java:72)
at tornadofx.PropertiesKt.setValue(Properties.kt:189)
at tornadofx.ItemViewModel.setItem(ViewModel.kt)
at net.riedel.mw.thirdparty.ui.channels.TestModelSpec$1$1$1.invoke(TestModelSpec.kt:23)
at net.riedel.mw.thirdparty.ui.channels.TestModelSpec$1$1$1.invoke(TestModelSpec.kt:18)
...
Я написал этот образец классы для воспроизведения проблемы:
import org.jetbrains.spek.api.Spek
import org.jetbrains.spek.api.dsl.describe
import org.jetbrains.spek.api.dsl.it
import tornadofx.*
class TestViewModel : ItemViewModel<TestModel>() {
val p1 = bind(TestModel::p1)
val p2 = bind(TestModel::p2)
}
data class TestModel (
val p1 : Int = 0,
val p2 : String = ""
)
object TestModelSpec : Spek(
{
val sut = TestViewModel()
describe("test model") {
it("should be able to assign item property") {
sut.item = TestModel()
}
}
}
)
Обновление 1 Одно из возможных решений может быть следующим:
Исключение «Toolkit not initialized», когда модульное тестирование приложения JavaFX
, которое действительно работает, когда я запускаю тест на своем локальном компьютере. Проблема в том, что когда тест выполняется на нашем CI-сервере, я все равно получаю следующее исключение:
java.lang.UnsupportedOperationException: Unable to open DISPLAY
at com.sun.glass.ui.gtk.GtkApplication.lambda$new$6(GtkApplication.java:173)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:171)
at com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41)
at com.sun.glass.ui.Application.run(Application.java:144)
at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:280)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:269)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
at javafx.embed.swing.JFXPanel.initFx(JFXPanel.java:241)
at javafx.embed.swing.JFXPanel.<init>(JFXPanel.java:257)
Дело в том, что поскольку мы не тестируем пользовательский интерфейс, я бы хотел избежать использования JavaFX в наших модульных тестах. , но мне все еще нужно протестировать logi c внутри наших ItemViewModels ... есть ли чистый способ сделать это?