使用assertTextEquals()测试Composable时触发IllegalStateException错误
问题解决:Compose测试中主线程异常的修复
错误原因
你把测试动作(performTextInput)和断言(assertTextEquals)代码嵌套在了setContent{}内部,而setContent是运行在UI主线程中的。Compose测试框架规定,涉及同步的测试操作(动作、断言、同步方法)不能在主线程执行,必须在测试线程中调用,这就是抛出IllegalStateException的根本原因。
修正后的测试代码
@get:Rule val composeTestRule = createComposeRule() @Test fun openSearchWidget_enterInputText_assertInputText() { var text by mutableStateOf("") // setContent仅负责渲染要测试的Compose界面 composeTestRule.setContent { SearchWidget(text = text, onTextChange = { text = it }) } // 测试动作和断言放在setContent外部,由测试线程执行 composeTestRule.onNodeWithContentDescription("TextField") .performTextInput("Tonnie") composeTestRule.onNodeWithContentDescription("TextField") .assertTextEquals("Tonnie") }
关键说明
setContent的唯一作用是配置并渲染待测试的Compose组件,所有测试逻辑(操作、断言)都必须放在这个代码块之外。- ComposeTestRule会自动处理界面渲染完成的等待逻辑,无需手动调用同步方法,直接在
setContent后执行测试操作即可。
内容的提问来源于stack exchange,提问作者Tonnie
相关产品推荐
相关产品推荐

