1

I am getting this error:

IllegalStateException: View android.widget.LinearLayout{649700d V.E...... ......I. 0,0-0,0} does not have a NavController set

But this happens only on espresso tests. The code where the crash happens handles onBackPressed on my fragment:

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

This is my Espresso Test:

    @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)
    }

If I remove my code on the fragment tests run without any error (except from what I assert wrong)

I did check: IllegalStateException: Link does not have a NavController set, but his/her problem is not same as mine.

PS: On production code this line doesn't crash

coroutineDispatcher
  • 7,718
  • 6
  • 30
  • 58

1 Answers1

0

I managed to resolve this, by replacing:

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

With:

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

Explenation, the nav controller is set on the view in my test using setViewNavController, thus I had to change my production code :)

coroutineDispatcher
  • 7,718
  • 6
  • 30
  • 58
  • I am having almost the same issue but i cannot fix it :( Can you help: https://stackoverflow.com/questions/62515314/android-espresso-does-not-have-a-navcontroller-set-error – Mervin Hemaraju Jun 22 '20 at 16:09