Почему IdlingResource для тестирования пользовательского интерфейса блокирует основной поток?

Я написал «минимальный» проект AS, чтобы воспроизвести проблему, с которой я столкнулся. Вот ссылка гх.

Я пытаюсь написать сквозной тест пользовательского интерфейса в моем проекте только для компоновки. Тест охватывает простой вход в систему -> синхронизация данных -> переход к основному варианту использования.

Вот и весь тест:

      @HiltAndroidTest
class ExampleInstrumentedTest {

    @get:Rule(order = 1)
    val hiltRule = HiltAndroidRule(this)

    @get:Rule(order = 2)
    val composeTestRule = createAndroidComposeRule<MainActivity>()

    @Inject
    lateinit var dao: DummyDao

    val isSyncing = mutableStateOf(false)

    @Before
    fun setup() {
        runBlocking {
            hiltRule.inject()
            dao.deleteAllData()
            dao.deleteUser()
        }

        composeTestRule.activity.isSyncingCallback = {
            synchronized(isSyncing) {
                isSyncing.value = it
            }
        }

        composeTestRule.registerIdlingResource(
            object : IdlingResource {
                override val isIdleNow: Boolean
                    get() {
                        synchronized(isSyncing) {
                            return !isSyncing.value
                        }
                    }
            }
        )
    }

    @Test
    fun runsTheStuffAndItWorks() {
        composeTestRule
            .onNodeWithText("login", ignoreCase = true, useUnmergedTree = true)
            .assertIsDisplayed()
            .performClick()

        composeTestRule
            .onNodeWithTag("sync")
            .assertExists()

        composeTestRule.waitForIdle()

        assertFalse(isSyncing.value)

        composeTestRule.onRoot().printToLog("not in the list")

        composeTestRule
            .onNodeWithTag("the list", useUnmergedTree = true)
            .assertIsDisplayed()
    }
}

Тест выполняется «хорошо» до того момента, когда он должен ждать, пока рабочий процесс синхронизации завершит свою работу и, наконец, перейдет к «основному компонуемому».

К сожалению, тест, по-видимому, блокирует поток пользовательского интерфейса устройства, когда ресурс бездействия не простаивает, завершая тест немедленно, как только ресурс бездействия становится бездействующим.

Я пробовал использовать эспрессо напрямую, но это тоже не сработало, показывая аналогичные результаты. Я пытался добавить композицию также в разных точках, но это тоже не сработало (добавление одного между вызовами навигации также блокирует поток пользовательского интерфейса, и тест завершается неудачей еще раньше).

Что я здесь делаю неправильно? Я забыл что-то настроить?

0 ответов