Android Navigation Instrumentation 测试抛出方法 addObserver 必须在主线程上调用

The*_*ian 12 kotlin android-espresso android-navigation-graph

我有两个 Fragment,一个是我图中的 home 片段。单击按钮后,用户将被导航到第二个片段。它通过将用户导航到第二个片段并显示文本来按预期工作。所以图很好。

现在我想编写一个仪器测试。

@RunWith(AndroidJUnit4::class)
class TransitionTest {

    @Test
    fun testNavigationToSecondFragment() {
        
        val navController = TestNavHostController(
            ApplicationProvider.getApplicationContext())

        navController.setGraph(R.navigation.my_graph) <--throws exception

        // the rest of my test continues here
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,上面显示的用于设置图形的行会引发以下异常:

IllegalStateException:必须在主线程上调用方法 addObserver。

我的环境:

fragment_version = 1.2.5 nav_version = 2.3.1 浓缩咖啡 = 3.3.0

有谁知道发生了什么以及如何解决它?

The*_*ian 8

我把这个setGraph函数包裹在里面runOnUiThread,测试通过了。一旦我找到真正的原因和更好的解决方案,我会更新答案。

runOnUiThread {
    navController.setGraph(R.navigation.my_graph)
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*mal 6

我遇到了同样的情况,所以我将尝试解释其根本原因。从androidx.lifecycle:lifecycle-*:2.3.0-alpha06. 中的行为发生了变化LifecycleRegistry LifecycleRegistry现在验证它的方法在主线程上被调用。现在还有一个悬而未决的问题是检测测试是否在 MainThread 中运行?显然没有,否则它就会通过。它使用Instrumentation Thread运行大多数测试。根据文档,您可以使用@UiThreadTestrunOnUiThread作为顶级答案