Я пишу тест пользовательского интерфейса, который переходит на экран поиска, выполняет поиск и нажимает на элемент, чтобы получить подробную информацию об этом элементе. Я получаю сбой на большинстве, но не на всех элементах, на которые нажимает тест автоматизации. Я вижу, что данные загружаются, но падают во время ожидания простоя.
Код:
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()" при загрузке страницы вызывает этот сбой. Мне это кажется странным, но если я добавлю задержку перед этим вызовом, это сработает. Тем не менее, это похоже на взлом.
Исправить: В моем случае я использовал «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)
}
}
}