You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:38:23