0

これは、TestFX のテストがどのように見えるかのスニペットであり、GitHub READMEから直接引っ張ってきました。

@ExtendWith(ApplicationExtension.class)
class ClickableButtonTest_JUnit5Hamcrest {

    private Button button;

    /**
     * Will be called with {@code @Before} semantics, i. e. before each test method.
     *
     * @param stage - Will be injected by the test runner.
     */
    @Start
    private void start(Stage stage) {
        button = new Button("click me!");
        button.setId("myButton");
        button.setOnAction(actionEvent -> button.setText("clicked!"));
        stage.setScene(new Scene(new StackPane(button), 100, 100));
        stage.show();
    }

    /**
     * @param robot - Will be injected by the test runner.
     */
    @Test
    void should_contain_button_with_text(FxRobot robot) {
        FxAssert.verifyThat(button, LabeledMatchers.hasText("click me!"));
        // or (lookup by css id):
        FxAssert.verifyThat("#myButton", LabeledMatchers.hasText("click me!"));
        // or (lookup by css class):
        FxAssert.verifyThat(".button", LabeledMatchers.hasText("click me!"));
    }

私の問題は、特にシーン/ルートを変更するアクションに関するものです。テストされているコントローラー/シーンの側面により、最後にルートが変更され、次のスタック トレースが生成されます。

Caused by: java.lang.NullPointerException
    at org.example/org.example.App.setRoot(App.java:67)
    at org.example/org.example.services.AppService.setRoot(AppService.java:20)
    at org.example/org.example.controllers.SecondaryController.switchToGameScreen(SecondaryController.java:64)
    ... 57 more

そのための私の解決策は、お気づきかもしれませんが、App(NPE を引き起こすなどのsetRoot) 静的メソッドのサービス ラッパー クラスを作成することでした。コントローラーにアクセスできれば、理論的には次のようにモックできます。モッキート。残念ながら、上記のコード例に戻ると、コントローラー クラスへのアクセスの概念はないようです。表面レベルの作成とステージとの対話を取得できますが、基になるコントローラーにアクセスする方法がわかりません。もちろん、サービス クラスをモックするには、物理​​コントローラーにアクセスする必要があります。

ラッパークラスをモックバージョンに設定できるように、そのクラスにアクセスする方法を知っている人はいますか?

誰かが実際に試してみたい場合は、ソースコードを提供できます。

4

1 に答える 1