簡體   English   中英

TestFX 和 Junit5 的 ExceptionInInitializerError

[英]ExceptionInInitializerError with TestFX and Junit5

我剛剛熟悉 Java 和 JavaFX,並且正在開發一個簡單的項目來測試 JavaFX UI。 但是,我認為我沒有正確初始化測試,因為我在實例化應用程序 object 時遇到了 ExceptionInInitializerError。 這是我的測試文件的相關部分:

public class AppGuiTest extends ApplicationTest {
private App app = new App();

    @Override
    public void start(Stage stage) throws Exception {
        stage.setScene(app.getScene());
        stage.show();
        stage.toFront();
    }

//tests here 
}

在應用程序 object 中定義 label 時會出錯:

Label message = new Label("Welcome!");

這是我的 Gradle 文件的相關部分:

plugins {
    id 'org.openjfx.javafxplugin' version '0.0.9'

}

dependencies {

    implementation 'org.testfx:testfx-junit:4.0.15-alpha'
    implementation 'org.loadui:testFx:3.1.2'

    implementation 'org.testfx:testfx-junit5:4.0.16-alpha'
    implementation 'org.junit.jupiter:junit-jupiter:5.8.1'
    implementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
}

javafx {
    version = "17"
    modules = [ 'javafx.controls' , 'javafx.base']
}

JavaFX 部件本身運行良好。 只有當我嘗試添加測試時才會出現異常。 這甚至是我應該如何初始化事物嗎? 當我從測試文件中刪除 app 變量並注釋掉測試的內容時,測試通過了。 如果我沒有定義我的應用程序 object,我該如何測試 UI 元素?

我不確定如何修復此錯誤,因此任何輸入都會非常有幫助。 提前致謝!

您可以使用JUnit 5標簽@ExtendWithTestFx ApplicationExtension class。 您還應該使用@Start標記作為啟動方法並在那里初始化Label (或App )。

import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import org.testfx.api.FxRobot;
import org.testfx.framework.junit5.ApplicationExtension;
import org.testfx.framework.junit5.Start;
import static org.testfx.assertions.api.Assertions.assertThat;

@ExtendWith(ApplicationExtension.class)
public class AppGuiTest {

    private Label message;

    @Start
    protected void start(Stage stage) {
        message = new Label("Welcome!");

        stage.setScene(new Scene(new StackPane(message)));
        stage.show();
    }

    @Test
    public void testMessage() {
        assertThat(message).hasText("Welcome!");
    }

    @Test
    public void testChangeMessage(FxRobot robot) {
        robot.interact(() -> message.setText("Bye!"));
        assertThat(message).hasText("Bye!");
    }

}

您的 JUnit 5 的 Gradle 應如下所示:

dependencies {
    testCompile 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testCompile "org.testfx:testfx-junit5:4.0.16-alpha"
    testCompile "org.testfx:testfx-core:4.0.16-alpha"
}

plugins {
    id 'org.openjfx.javafxplugin' version '0.0.10'
}

javafx {
    version = '17'
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM