Android横竖屏切换测试失败求助:状态识别异常及空指针问题
解决横竖屏测试失败及Activity销毁空指针问题
1. 修正@Before/@After的方向恢复逻辑
你当前的@Before和@After都硬编码为竖屏,会覆盖设备原始方向,导致测试间状态污染。正确做法是保存测试前的初始方向,测试后恢复该方向:
private var initialOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED @Before fun setUp() { MyRule.scenario.onActivity { activity -> // 保存测试前的设备原始方向 initialOrientation = activity.requestedOrientation // 测试前统一初始化竖屏状态(可选,根据测试需求调整) activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } } @After fun tearDown() { MyRule.scenario.onActivity { activity -> // 恢复到测试前的原始方向,而非固定竖屏 if (!activity.isFinishing && !activity.isDestroyed) { activity.requestedOrientation = initialOrientation } } }
2. 使用Espresso官方API处理横竖屏切换
直接操作requestedOrientation容易出现Activity销毁空指针,推荐用Espresso的DeviceActions,它会自动处理Activity重建、状态等待等逻辑:
// 测试竖屏场景 @Test fun testPortraitLayout() { // 设置竖屏 onView(isRoot()).perform(setOrientationPortrait()) // 执行测试逻辑,例如检查控件显示状态 onView(withId(R.id.task_list)).check(matches(isDisplayed())) } // 测试横屏场景 @Test fun testLandscapeLayout() { // 设置横屏 onView(isRoot()).perform(setOrientationLandscape()) // 执行测试逻辑 onView(withId(R.id.landscape_task_panel)).check(matches(isDisplayed())) }
需要确保依赖Espresso设备动作库(在build.gradle中添加):
androidTestImplementation 'androidx.test.espresso:espresso-device:3.5.0'
3. 保证测试间的Activity隔离
同一测试类中,确保每个测试方法启动独立的Activity实例,避免状态残留:
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java)
每个测试方法执行时,ActivityScenarioRule会自动创建新的Activity,测试结束后销毁,彻底隔离测试状态。
4. 手动操作Activity时的存活检查
如果必须直接通过scenario.onActivity操作方向,先判断Activity状态,避免空指针:
@Test fun testCustomOrientation() { activityRule.scenario.onActivity { activity -> // 仅在Activity未销毁时执行操作 if (!activity.isDestroyed && !activity.isFinishing) { activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE } } // 可选:等待Activity重建完成(推荐用IdlingResource替代sleep) Thread.sleep(500) // 执行测试逻辑 }
内容的提问来源于stack exchange,提问作者Striving Programmer
相关产品推荐
相关产品推荐

