TornadoFX: при тестировании ItemViewModel с помощью Spek возникает исключение «Toolkit not initialized» при назначении свойства «item» - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы написать тест для класса 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 ... есть ли чистый способ сделать это?

...