浓缩咖啡测试失败

11

我正在进行Android中的Espresso测试。测试失败并显示以下错误:

java.lang.ClassCastException: androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity 无法转换为com.stavro_xhardha.pockettreasure.MainActivity

这是我的测试方法:

@Test
fun toolbarTitle_shouldContainCorrectInput() {
    val mockNavController = mock(NavController::class.java)
    val fragmentScenario = launchFragmentInContainer<SetupFragment>()
    fragmentScenario.onFragment {
        Navigation.setViewNavController(it.view!! , mockNavController)
    }
    onView(withId(R.id.toolbar)).check(matches(withText("Pick your country")))
}

但错误并不是来自于Test类,而是来自于我正在测试的片段(Fragment)。 错误会在这行代码执行时崩溃:

override fun onStart() {
    super.onStart()
    (activity!! as MainActivity).supportActionBar?.hide() //here
}

我不理解的是,在没有执行测试的情况下正常运行应用程序时,我没有遇到任何错误。


这意味着你的“activity”是一个“EmptyFragmentActivity”,而你试图将其转换为“MainActivity”。 - Dmitriy Mitiai
什么是 EmptyFragmentActivity - coroutineDispatcher
1
你有没有阅读关于launchFragmentInContainer的文档?这个功能所做的就是将给定的片段放置在内部的EmptyFragmentActivity类中并在其中启动它,将片段放置在根视图容器中。 - Dmitriy Mitiai
2个回答

23

以下是完整答案:
关于launchFragmentInContainer - 它将给定的片段启动在一个内部的EmptyFragmentActivity类中 - 将片段放置在根视图容器内。
因此,它应该只用于检查与其父活动无关的片段。

在您的情况下,您尝试隐藏在正在测试的片段中的操作栏。 但是在测试中,您的片段不会在MainActivity中启动。
如果您想仅检查片段,而不是使用(activity !! as MainActivity).supportActionBar?.hide(),您需要编写类似于以下内容:

if(activity!! is MainActivity){
    activity?.supportActionBar?.hide()
}

或者您应该为MainActivity或使用碎片的地方编写测试


1
在我的情况下,隐藏ActionBar有所帮助。
  if (activity is AppCompatActivity) {
                (activity as AppCompatActivity).supportActionBar?.hide()
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接