这个问题通常是由于Compose UI在测试中处理大量工作而导致的,因此增加线程休眠时间或使用IdlingResource来等待Compose完成渲染可以解决这个问题。以下是使用IdlingResource的代码示例:
class ComposeIdlingResource(private val composeRule: AndroidComposeRule<*>) : IdlingResource {
private var resourceCallback: IdlingResource.ResourceCallback? = null
private var isIdle = true
init {
composeRule.onNode { isIdle = it.isForIdle }
}
override fun getName(): String {
return ComposeIdlingResource::class.simpleName ?: "ComposeIdlingResource"
}
override fun isIdleNow(): Boolean {
isIdle = composeRule.activityRule.activity.composeView == null || composeRule.activityRule.activity.composeView!!.isForIdle
return isIdle
}
override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
resourceCallback = callback
}
}
在测试文件中,创建ComposeIdlingResource并将它注册到IdlingRegistry中即可:
val idlingResource = ComposeIdlingResource(composeRule)
IdlingRegistry.getInstance().register(idlingResource)
在测试的最后,需要unregister IdlingResource:
IdlingRegistry.getInstance().unregister(idlingResource)