これは、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
) 静的メソッドのサービス ラッパー クラスを作成することでした。コントローラーにアクセスできれば、理論的には次のようにモックできます。モッキート。残念ながら、上記のコード例に戻ると、コントローラー クラスへのアクセスの概念はないようです。表面レベルの作成とステージとの対話を取得できますが、基になるコントローラーにアクセスする方法がわかりません。もちろん、サービス クラスをモックするには、物理コントローラーにアクセスする必要があります。
ラッパークラスをモックバージョンに設定できるように、そのクラスにアクセスする方法を知っている人はいますか?
誰かが実際に試してみたい場合は、ソースコードを提供できます。