Я хочу протестировать свое приложение 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");
в тестовый класс, и теперь он работает