Тест пройден на TestFX, но не в режиме без головы

Я использую TestFX для проверки выбора нескольких элементов в ListView с использованием Ctrl нажмите кнопку, затем создайте диалоговое окно с предупреждением, содержимое которого основано на выбранных элементах.

press(KeyCode.CONTROL);
clickOn((Node) lookup(hasText("Item 0")).query());
verifyThat((Node) lookup(hasText("Item 0")).query(), Node::isFocused);
clickOn((Node) lookup(hasText("Item 1")).query());
verifyThat((Node) lookup(hasText("Item 1")).query(), Node::isFocused);
clickOn((Node) lookup(hasText("Item 2")).query());
verifyThat((Node) lookup(hasText("Item 2")).query(), Node::isFocused);
release(KeyCode.CONTROL);

clickOn("actionButton");
alertDialogHasHeaderAndContent("Items selected: 3"); // my own function

В режиме заголовка

Тесты все проходят.

В режиме без головы

Три verifyThat тестирует все проходы, но когда он нажимает на кнопку и проверяет, что полученное диалоговое окно предупреждения является правильным, это не так; генерируется предупреждение, как если бы был выбран только один элемент из списка.

Это приводит к:

org.junit.ComparisonFailure: 
Expected :Items selected: 3
Actual   :Items selected: 1

Вот alertDialogHasHeaderAndContent для полноты:

/**
 * Checks the current alert dialog displayed (on the top of the window stack) has the expected contents.
 *
 * From https://stackru.com/a/48654878/8355496
 * Licenced under cc by-sa 3.0 with attribution required https://creativecommons.org/licenses/by-sa/3.0/
 * @param expectedHeader Expected header of the dialog
 * @param expectedContent Expected content of the dialog
 */
private void alertDialogHasHeaderAndContent(final String expectedHeader, final String expectedContent) {
    final Stage actualAlertDialog = getTopModalStage();
    assertNotNull(actualAlertDialog);

    final DialogPane dialogPane = (DialogPane) actualAlertDialog.getScene().getRoot();
    assertEquals(expectedHeader, dialogPane.getHeaderText());
    assertEquals(expectedContent, dialogPane.getContentText());
}

/**
 * Get the top modal window.
 *
 * Adapted from https://stackru.com/a/48654878/8355496
 * Licenced under cc by-sa 3.0 with attribution required https://creativecommons.org/licenses/by-sa/3.0/
 * @return the top modal window
 */
private Stage getTopModalStage() {
    // Get a list of windows but ordered from top[0] to bottom[n] ones.
    // It is needed to get the first found modal window.
    final List<Window> allWindows = new ArrayList<>(new FxRobot().robotContext().getWindowFinder().listWindows());
    Collections.reverse(allWindows);

    return (Stage) allWindows
            .stream()
            .filter(window -> window instanceof Stage)
            .findFirst()
            .orElse(null);
}

1 ответ

Решение

Это проблема с Monocole. См. https://github.com/TestFX/TestFX/issues/566 для получения дополнительной информации.

Другие вопросы по тегам