尝试 运行 EspressoTest 时 NavController 出现问题
Problem with NavController when trying to run 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)
}
})
这是我的 Espresso 测试:
@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)
}
如果我删除片段测试中的代码 运行 没有任何错误(除了我断言的错误)
我检查过:,但是 his/her 问题和我的不一样。
PS:在生产代码中,此行不会崩溃
我设法通过替换解决了这个问题:
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
设置的,因此我不得不更改我的生产代码:)
我收到这个错误:
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)
}
})
这是我的 Espresso 测试:
@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)
}
如果我删除片段测试中的代码 运行 没有任何错误(除了我断言的错误)
我检查过:
PS:在生产代码中,此行不会崩溃
我设法通过替换解决了这个问题:
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
设置的,因此我不得不更改我的生产代码:)