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

Kotlin 必须在主线程上调用Android Navigation Instrumentation测试抛出方法addObserver,kotlin,android-espresso,android-navigation-graph,Kotlin,Android Espresso,Android Navigation Graph,我有两个片段,一个是图中的主片段。单击按钮后,用户将被导航到第二个片段。它通过将用户导航到第二个片段并显示文本来实现预期的效果。所以这张图很好 现在我想写一个仪器测试 @RunWith(AndroidJUnit4::class) class TransitionTest { @Test fun testNavigationToSecondFragment() { val navController = TestNavHostController

我有两个片段,一个是图中的主片段。单击按钮后,用户将被导航到第二个片段。它通过将用户导航到第二个片段并显示文本来实现预期的效果。所以这张图很好

现在我想写一个仪器测试

@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
    }
}
@RunWith(AndroidJUnit4::class)
类传递测试{
@试验
趣味测试导航到SecondFragment(){
val navController=TestNavHostController(
ApplicationProvider.getApplicationContext())

navController.setGraph(R.navigation.my_graph)我将
setGraph
函数包装在
runOnUiThread
中,测试通过。一旦找到真正的原因和更好的解决方案,我将更新答案

runOnUiThread {
    navController.setGraph(R.navigation.my_graph)
}

升级软件包后,我也开始出现此问题:

implementation 'androidx.activity:activity:1.2.0-alpha06'

在我的代码中,我在后台线程中打开了一个片段,这似乎与新的包有关。该片段在生命周期中添加了一个观察者:


我认为将调用包装为在UI线程上运行是唯一可行的解决方案,因为在您的案例中,可能也会在内部添加观察者。

我也遇到了同样的问题,因此我将尝试解释这一问题的根本原因。
androidx.lifecycle:lifecycle-*:2.3.0-alpha06
开始。在
LifecycleRegistry
中有一个行为更改。现在验证其方法是否在主线程上调用。现在还有一个问题没有解决,即插装测试是否在主线程中运行?显然没有,否则它会通过。它在大多数测试运行的地方使用。根据文档,您可以使用顶部的
@UiThreadTest
runOnUiThread

使用此选项还有一个解决问题的方法

InstrumentationRegistry.getInstrumentation().runOnMainSync {
            navController.setGraph(R.navigation.my_graph)
        }

由于
@UiThreadTest
只能在
@Test
@Before
@Before
中工作,因此如果您有一些常见的测试功能,它们可能无法按预期工作

我在升级了一些软件包后也开始使用它,包括将浓缩咖啡从3.2.0移到3.3.0以及其他android/google软件包。在我的情况下,它可以ppens在运行时代码中,而我能够在后台线程中添加观察器,所以它肯定不是浓缩咖啡。
InstrumentationRegistry.getInstrumentation().runOnMainSync {
            navController.setGraph(R.navigation.my_graph)
        }