尝试运行EspressoTest时NavController出现问题

时间:2019-06-27 09:12:29

标签: android android-espresso android-architecture-components android-architecture-navigation

我收到此错误:

  

IllegalStateException:查看android.widget.LinearLayout {649700d   V.E ...... ...... I。 0,0-0,0}没有设置NavController

但这仅在浓缩咖啡测试中发生。发生崩溃的代码处理片段上的onBackPressed:

val navController = Navigation.findNavController(view)//this line here
        requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                navController.popBackStack(R.id.homeFragment, false)
            }
        })

这是我的浓缩咖啡测试:

    @Test
    fun testBackButton() {
        val mockNavController = mock(NavController::class.java)
        settingsFragmentScenario = launchFragmentInContainer()
        settingsFragmentScenario.onFragment {
            Navigation.setViewNavController(it.requireView(), mockNavController)
        }
        performClickOnViews(android.R.id.home)
        verify(mockNavController).navigate(R.id.home)
    }

如果我在片段测试中删除我的代码,则运行时没有任何错误(我断言的错误除外)

我确实检查过:IllegalStateException: Link does not have a NavController set,但他/她的问题与我的不同。

PS:在生产代码上,此行不会崩溃

1 个答案:

答案 0 :(得分:0)

我设法解决了这一问题,方法是替换为:

val navController = Navigation.findNavController(view)//this line here
        requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                navController.popBackStack(R.id.homeFragment, false)
            }
        })

使用:

requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                view.findNavController().popBackStack(R.id.homeFragment, false)
            }
        })

Explenation,导航控制器是在我的测试中使用setViewNavController设置在视图上的,因此我不得不更改生产代码:)