Сбой теста пользовательского интерфейса с использованием ComposeRule

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

Код:

composeTestRule.waitForIdle()

Крушение:

Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.compose.ui.node.LayoutNode.getNeedsOnPositionedDispatch$ui_release()' on a null object reference
        at androidx.test.espresso.Espresso.onIdle(Espresso.java:35)
        at androidx.test.espresso.Espresso.onIdle(Espresso.java:21)
        at androidx.compose.ui.test.junit4.EspressoLink_androidKt.runEspressoOnIdle(EspressoLink.android.kt:92)
        at androidx.compose.ui.test.junit4.EspressoLink.runUntilIdle(EspressoLink.android.kt:79)
        at androidx.compose.ui.test.AndroidComposeUiTestEnvironment.waitForIdle(ComposeUiTest.android.kt:308)
        at androidx.compose.ui.test.AndroidComposeUiTestEnvironment.access$waitForIdle(ComposeUiTest.android.kt:217)
        at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitForIdle(ComposeUiTest.android.kt:391)
        at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitForIdle(AndroidComposeTestRule.android.kt:177)

Обновлять: Я обнаружил, что это вылетает после «focusRequester.requestFocus()» в моем макете, но только если в списке есть элементы, запрашивающие фокус. я проверил, что focusRequester не равен нулю.

Обновление 2: Я обнаружил, что запуск "lazyListState.scrollToItem()" при загрузке страницы вызывает этот сбой. Мне это кажется странным, но если я добавлю задержку перед этим вызовом, это сработает. Тем не менее, это похоже на взлом.

1
0
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исправить: В моем случае я использовал «lazyListState.scrollToItem()» внутри модификатора «onFocusChanged», для которого требуется сопрограмма. Вынос этого кода в «launchedEffect» устранил эту проблему.

Так изменить это

.onFocusChanged { event ->
    if (event.isFocused) {
        coroutineScope.launch {
            lazyColumnState.scrollToItem(selectedItemIndex, 0)
        }
    }
}

К этому

LaunchedEffect(key1 = hasFocus) {
    if (hasFocus) {
        coroutineScope.launch {
            lazyColumnState.scrollToItem(selectedItemIndex, 0)
        }
    }
}

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