Jetpack Compose测试切换方向报No compose views found错误如何修复?
报错原因
你触发屏幕切换时,Android系统默认会销毁并重建当前Activity,测试使用的Compose规则与重建前的Activity绑定,重建后丢失了Compose视图的引用,就会抛出找不到Compose视图的异常。手动测试正常是因为重建后Activity会重新加载你的Composable内容,但是自动化测试的上下文没有跟着重建更新,所以找不到节点。
修复方案
- 给测试用Activity配置配置变更处理策略
在androidTest目录下的AndroidManifest.xml中添加如下配置,让系统在横竖屏切换时不销毁Activity,由应用自行处理配置变更:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <activity android:name="androidx.activity.ComponentActivity" android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout" /> </application> </manifest>
- 调整测试规则,切换屏幕后等待界面渲染完成
将原来的无Activity Compose测试规则替换为带官方ComponentActivity的测试规则,同时点击按钮后添加等待界面空闲的逻辑,确保横竖屏切换完成后再执行断言:
@get:Rule val composeRule = createAndroidComposeRule<ComponentActivity>() @Test fun test() { composeRule.setContent { MyApp() } // 初始竖屏校验 composeRule.onNodeWithText("P").assertIsDisplayed() // 点击切换横屏 composeRule.onNodeWithText("DO IT").performClick() // 等待界面更新完成 composeRule.waitForIdle() // 校验横屏文本 composeRule.onNodeWithText("L").assertIsDisplayed() }
补充优化点:你现有代码中判断横竖屏用的
LocalConfiguration.current.orientation对应常量是Configuration.ORIENTATION_PORTRAIT和Configuration.ORIENTATION_LANDSCAPE,和你对比的ActivityInfo.SCREEN_ORIENTATION_PORTRAIT值碰巧一致能正常运行,建议替换成Configuration下的常量,避免后续系统版本更新出现兼容性问题。
内容的提问来源于stack exchange,提问作者theapache64
相关产品推荐
相关产品推荐

