首页 > 解决方案 > 测试导航 - IncompatibleClassChangeError -TestNavHostController 被声明为最终

问题描述

我正在尝试在我的示例应用程序中测试导航。我已经学习了谷歌导航测试教程。这是我的代码:

    @RunWith(AndroidJUnit4::class)
    @LargeTest
    class NavigationTest {
        @get:Rule
        val activityRule = ActivityScenarioRule(MainActivity::class.java)
    
        @Test
        fun checkNavigation() {
            // -------- crash --------
            val navController = 
                TestNavHostController(ApplicationProvider.getApplicationContext())
            // -----------------------

            navController.setGraph(R.navigation.nav_graph)
            val fragmentScenario = launchFragmentInContainer<FirstFragment>()
            fragmentScenario.onFragment { frag ->
                Navigation.setViewNavController(frag.requireView(), navController)
            }
   
            onView(withId(R.id.button_first)).perform(click())
            assertEquals(navController.currentDestination?.id, R.id.SecondFragment)
        }
    }

我在第一行测试时崩溃了:

java.lang.IncompatibleClassChangeError: Superclass androidx.navigation.NavHostController of androidx.navigation.testing.TestNavHostController is declared final (declaration of 'androidx.navigation.testing.TestNavHostController' appears in /data/app/myApp.test-2vutApQLPNgS6e58B0_9tQ==/base.apk)

我与测试相关的 build.gradle 行:

    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestImplementation 'androidx.test:rules:1.3.0'
    androidTestImplementation "androidx.navigation:navigation-testing:2.3.1"
    androidTestImplementation "androidx.fragment:fragment-testing:1.2.5"
    testImplementation 'junit:junit:4.13.1'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'

我在两部手机上都试过了,两者都是一样的(三星安卓 8.0 和华为安卓 10)

我只看到了与 firebase 相关的崩溃,答案是更新我的 sdk-tools。我做到了,但没有运气。我找不到关于这个话题的任何答案。知道如何解决这个问题吗?

标签: androidtestingnavigation

解决方案


再次浏览代码后,我注意到我使用了:

androidx.navigation:navigation-fragment-ktx:2.2.2 

将库更新到 2.3.1 使崩溃消失。唷。


推荐阅读