Переключение между сценами в testFx - PullRequest
0 голосов
/ 30 мая 2020

Я хочу протестировать свое приложение JavaFX с помощью testFx. Пользователь заполнил форму входа в систему, нажмите кнопку logInBtn, приложение покажет предупреждение и откроет панель клиента. Тест запускается и показывает предупреждение, но после этого сцена должна переключиться на другую, и я получаю много ошибок.

public class App extends Application {
private static Scene scene;
@Override
public void start(Stage stage) throws IOException {
    scene = new Scene(loadFXML("logIn"));
    stage.setScene(scene);
    stage.show();
}

public static void setRoot(String fxml) throws IOException {
    scene.setRoot(loadFXML(fxml));
}

private static Parent loadFXML(String fxml) throws IOException {
    FXMLLoader fxmlLoader = new FXMLLoader(App.class.getClassLoader().getResource( fxml + ".fxml"));
    return fxmlLoader.load();
}

public static void main(String[] args) {
    launch();
}

}

Мой тестовый класс:

public class AppTest extends ApplicationTest {
@Override
public void start(Stage stage) throws Exception {
    Parent mainNode = FXMLLoader.load(App.class.getClassLoader().getResource("logIn.fxml"));
    stage.setScene(new Scene(mainNode));
    stage.show();
    stage.toFront();
}
@Test 
public void signUpTest() {
    //filling the logIn form out
    clickOn("#logInBtn");
}

logInBtn: <Button fx:id="logInBtn" onAction="#logIn"

метод входа в систему:

@FXML
private void logIn() throws IOException {
    ... /*grabbing data from the form fields, db manipulation*/
    if (personDbController.isLogged(mail, password)) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setContentText("You are successfully logged in!");
        App.setRoot("catalogCustomer");
    } 
}

Я получаю следующие ошибки:

--- Exception in Async Thread --- 
java.lang.reflect.InvocationTargetException: null
java.lang.IllegalStateException: Location is not set.
javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2434)
javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
App.loadFXML(App.java:36) (this is method loadFXML in App class)
App.setRoot(App.java:31)
 - java.lang.RuntimeException: java.lang.RuntimeException: 
 - java.lang.reflect.InvocationTargetException
at org.testfx.util.WaitForAsyncUtils.---- Delayed Exception: (See Trace Below) ----(WaitForAsyncUtils.java:0)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.IllegalStateException: Location is not set.

Я думаю, это происходит, потому что bcs testFX не может правильно получить доступ к потокам JavaFX, поэтому я не могу переключаться между сценами. Я смотрел документацию testFX - как переключаться между сценами, но ничего не нашел. Кто-нибудь знает, как это исправить?

РЕШЕНО: Проблема заключалась в том, что функция set Root не могла быть запущена bcs, сцена не существовала в классе basi c (сцена была создана и открыта в потоке тестового класса, а не в основном ). Я добавил AppTest.setRoot("catalogAdmin"); в тестовый класс, и теперь он работает

...