Проблема с NavController при попытке запустить EspressoTest

Я получаю эту ошибку:

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

Но это происходит только на эспрессо-тестах. Код, в котором происходит сбой, обрабатывает 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: ссылка не имеет набора NavController, но его/ее проблема не такая, как у меня.

PS: в производственном коде эта строка не падает

1
0
1 172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось решить эту проблему, заменив:

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

Объяснение, навигационный контроллер установлен в представлении в моем тесте с помощью setViewNavController, поэтому мне пришлось изменить свой производственный код :)

У меня почти такая же проблема, но я не могу ее исправить :( Можете ли вы помочь: stackoverflow.com/questions/62515314/…

Mervin Hemaraju 22.06.2020 18:09

Другие вопросы по теме