Почему 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()
}
}
Тест выполняется «хорошо» до того момента, когда он должен ждать, пока рабочий процесс синхронизации завершит свою работу и, наконец, перейдет к «основному компонуемому».
К сожалению, тест, по-видимому, блокирует поток пользовательского интерфейса устройства, когда ресурс бездействия не простаивает, завершая тест немедленно, как только ресурс бездействия становится бездействующим.
Я пробовал использовать эспрессо напрямую, но это тоже не сработало, показывая аналогичные результаты. Я пытался добавить композицию
Что я здесь делаю неправильно? Я забыл что-то настроить?