Как протестировать навигацию при использовании Jetpack Compose на WearOSAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как протестировать навигацию при использовании Jetpack Compose на WearOS

Сообщение Anonymous »

Я хочу написать подключенные тесты Android, которые проверяют поведение графического интерфейса и запускаемую навигацию. Например, проведя пальцем по одному экрану, чтобы открыть меню, которое представляет собой вызов Navigation() для перехода на другой экран.
Раньше я использовал библиотеку Mockk, чтобы имитировать NavHostController. , но когда я обновился до более последней версии Kotlin (2),ockk и Jetpack Compose, это больше не работало.
В документации Android указано, что следует использовать TestNavHostController, но на практике у меня это не сработало.
Соответствующие версии библиотеки:
junit = "4.13.2"
kotlin = "2.0.21"
mockk = "1.13.13"
robolectric = "4.13"
navigation-compose = "2.8.4"


Если я попробую использовать макет:
@MockK
lateinit var navHostController: NavHostController

@Before
fun setupTest() {
navHostController = mockk(relaxed = true)
}

@Test
fun `test with navhost`() {
composeTestRule.setContent {
MyLog(navHostController = navHostController, viewModel = myViewModel)
}
}


После этого я получаю сообщение об ошибке, что не могу создать экземпляр прокси для класса NavHostController:
com.example.display.presentation.components.MyLogTest > tapping a card calls onInitiate[Wear_OS_Large_Round_API_34(AVD) - 14] FAILED
io.mockk.MockKException: Can't instantiate proxy for class androidx.navigation.NavHostController
at io.mockk.impl.instantiation.JvmMockFactory.newProxy(JvmMockFactory.kt:64)

А если я попробую использовать TestNavHostController:
val navHostController = TestNavHostController(
ApplicationProvider.getApplicationContext(),
)
navHostController.createGraph(startDestination = Screen.MainScreen) {
composable(Screen.MainScreen.route) {
MainScreen(navHostController = navHostController)
}
composable(Screen.MainMenu.route) {
MainMenu(navHostController)
}
}
composeTestRule.setContent {
navHostController.navigatorProvider.addNavigator(ComposeNavigator())
MainScreen(myViewModel, navHostController)
}
mainscreen.performTouchInput { swipeLeft(startX = 300f, endX = 100f) }
assertEquals(Screen.MainMenu.route, navHostController.currentDestination?.route)


Я получаю сообщение об ошибке, что TestNavigatorProvider невозможно привести к WearNavigator:
com.example.display.presentation.components.MainScreenTest > when user swipes left it opens the main menu[Wear_OS_Large_Round_API_34(AVD) - 14] FAILED
java.lang.ClassCastException: androidx.navigation.testing.TestNavigatorProvider$navigator$1 cannot be cast to androidx.wear.compose.navigation.WearNavigator
at androidx.wear.compose.navigation.NavGraphBuilderKt.composable(NavGraphBuilder.kt:55)


Подробнее здесь: https://stackoverflow.com/questions/792 ... -on-wearos
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»