【发布时间】:2020-10-03 14:22:21
【问题描述】:
我目前正在测试我的导航(Jetpack + Espresso)。我有 2 个片段:
- 片段 1 包含一个 RecyclerView
- 片段 2 用于向 RecyclerView 添加另一个条目
我已经编写了从 Fragment 1 导航到 Fragment 2 的测试:
@Test
fun clickAddItemButton_navigateToAddItemFragment() {
val navController = mock(NavController::class.java)
launchFragmentInHiltContainer<ToDoListFragment> {
Navigation.setViewNavController(requireView(), navController)
}
onView(withId(R.id.fabAddItem)).perform(click())
verify(navController).navigate(
ToDoListFragmentDirections.actionToDoListFragmentToAddItemFragment()
)
}
如何测试从 Fragment2 到 Fragment1 的后退导航?我到目前为止的测试抛出了一个异常:
@Test
fun pressBackButton_navigateToListFragment() {
val navController = Mockito.mock(NavController::class.java)
launchFragmentInHiltContainer<AddItemFragment> {
Navigation.setViewNavController(requireView(), navController)
}
// simulate back button press
pressBack()
// verify navigation to second fragment
Mockito.verify(navController).navigate(
AddItemFragmentDirections.actionAddItemFragmentToToDoListFragment()
)
}
例外:
androidx.test.espresso.NoActivityResumedException: Pressed back and killed the app
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:1538)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:96)
at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:59)
at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:322)
at androidx.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:178)
at androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:119)
at androidx.test.espresso.Espresso.pressBack(Espresso.java:229)
【问题讨论】:
-
了解您是否在应用程序代码中实现了正确的后退导航处理会很有帮助。看起来您正试图通过导航操作从片段 #2 导航到 #1,这通常不是导航的工作方式。当您按下返回时,片段 #2 将简单地从返回堆栈中删除。
-
我使用的是标准的、开箱即用的 Jetpack Back Navigation。我刚刚使用导航图设置导航,将导航控制器添加到我的活动中,还专门处理了向上按钮。我是否应该实现自定义后退导航,从后台弹出片段以便能够对其进行测试?
-
我还编写了上面测试的另一个版本,用于检查片段是否已从后台堆栈中删除:
Mockito.verify(navController).popBackStack()在我的导航图中设置了 popUpTo 属性后,但测试仍然失败,同样的例外 -
您是否尝试在模拟器上对其进行测试。尤其是那些导航的东西,我在真实设备上遇到了问题。
标签: android android-espresso android-jetpack android-architecture-navigation