【问题标题】:Espresso pressBack() to check if back navigation works with Jetpack Navigation ComponentEspresso pressBack() 检查后退导航是否适用于 Jetpack 导航组件
【发布时间】: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


【解决方案1】:

根据您失败的测试,您只需从 AddItemFragment 中按回,这只是容器中的片段。这就是它失败的原因。要使其正常工作,首先启动 ToDoListFragment ,导航到 AddItemFragment 然后 pressback() 以验证您已移至 listfragment。基本上 clickAddItemButton_navigateToAddItemFragment 中的代码需要放在第二个测试的首位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多