首页 > 解决方案 > 浓缩咖啡测试失败

问题描述

我正在 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 类,而是来自我的被测片段。崩溃是在这行代码中执行的:

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

我在这里没有得到的是,当我在没有测试的情况下正常运行应用程序时,我没有遇到任何错误。

标签: androidandroid-fragmentsandroid-espressoandroid-testingandroid-navigation

解决方案


这是完整的答案。
About launchFragmentInContainer- 它获取给定的片段并在内部EmptyFragmentActivity类中启动它 - 将片段放置在根视图容器中。
因此,它应该只用于检查片段,而不依赖于它的父活动。

在您的情况下,您尝试在您正在测试的片段内隐藏一个操作栏。但在测试中,您的片段不会在 MainActivity 中启动。
如果你只想检查片段,而不是(activity!! as MainActivity).supportActionBar?.hide()你需要写这样的东西:

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

或者你应该为你的 MainActivity 或者你在哪里使用你的片段编写测试


推荐阅读