运行Android Instrumented Tests时如何捕获Activity抛出的异常
问题原因
- 你使用的
ActivityScenarioRule默认会在测试方法执行前自动启动目标SomeActivity,此时onCreate中的异常已经在应用主线程抛出,没有落入你测试方法内的try-catch捕获范围,直接导致测试崩溃。 - Activity生命周期的异常默认不会自动传播到测试线程,只有手动调用
ActivityScenario的启动/状态切换方法时,框架才会将生命周期中产生的异常同步抛出到测试线程。
解决方案
直接弃用自动启动的ActivityScenarioRule,在测试方法中手动调用ActivityScenario.launch启动Activity,此时启动过程抛出的异常会直接传播到测试线程,可以直接捕获验证。
修正后的测试代码
@RunWith(AndroidJUnit4::class) class SomeActivityInstrumentedTest { @Test fun launchWithoutId_throwsExpectedError() { // 手动构造启动Intent,不传入EXTRA_ID参数 val intent = Intent( ApplicationProvider.getApplicationContext(), SomeActivity::class.java ) // 捕获启动过程抛出的异常 val thrownError = assertFailsWith<Error> { ActivityScenario.launch<SomeActivity>(intent) } // 验证异常信息符合预期 assertEquals("id is null", thrownError.message) } }
注意事项
- 如果你需要测试传了正确ID的正常启动场景,只需要给Intent添加
putExtra("EXTRA_ID", "测试ID")参数即可,不会抛出异常。 - 不要在测试中手动多次调用
moveToState切换状态来触发启动,直接用launch方法会自动走完到RESUMED的生命周期,且同步返回异常。
内容的提问来源于stack exchange,提问作者imnewplsdonthate
相关产品推荐
相关产品推荐

