如何检测Activity是否接收其他Activity发送的Intent?Espresso测试求助
问题1:如何检查一个Activity是否接收到来自另一个Activity的Intent?
其实很简单,在目标Activity(比如你说的Activity2)的onCreate方法里,直接通过getIntent()就能拿到启动它的那个Intent,接着就可以检查里面的extras啦。举个例子:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_2); Intent receivedIntent = getIntent(); if (receivedIntent != null) { // 先检查有没有你要的那个key对应的extra if (receivedIntent.hasExtra("YOUR_CUSTOM_KEY")) { String extraValue = receivedIntent.getStringExtra("YOUR_CUSTOM_KEY"); // 这里你可以把值显示在UI上,或者打个日志确认一下 Log.d("Activity2", "收到的extra值:" + extraValue); } } }
要是方便测试的话,还可以在Activity2里写个公开方法,直接返回Intent里的extra内容,这样测试的时候就能直接调用啦。
问题2:用Espresso测试Activity2是否收到Activity1的Intent(带Extras)
别慌,我给你分两种场景讲,从简单到完整流程都有,跟着做就行:
第一步:先确保项目加了Espresso依赖
先打开你模块级的build.gradle文件,把这些依赖加上(版本号可以用最新的):
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.ext:junit:1.1.5'
场景1:单独测试Activity2的Intent接收(不用启动Activity1)
这种方式适合单独验证Activity2处理Intent的逻辑,不用依赖Activity1的跳转代码,很直接:
创建一个测试类,放在androidTest目录下,比如叫Activity2IntentTest:
@RunWith(AndroidJUnit4.class) public class Activity2IntentTest { @Test public void testActivity2GetsCorrectExtras() { // 先构建一个和Activity1发送的一模一样的Intent Intent testIntent = new Intent(ApplicationProvider.getApplicationContext(), Activity2.class); testIntent.putExtra("USER_NAME", "Ray"); testIntent.putExtra("USER_SCORE", 95); // 启动Activity2 ActivityScenario<Activity2> scenario = ActivityScenario.launch(testIntent); // 方式一:直接获取Activity实例,检查Intent里的extras scenario.onActivity(activity -> { Intent receivedIntent = activity.getIntent(); assertNotNull("Intent不能为null哦", receivedIntent); assertEquals("Ray", receivedIntent.getStringExtra("USER_NAME")); assertEquals(95, receivedIntent.getIntExtra("USER_SCORE", -1)); // 第二个参数是默认值,用来判断有没有拿到值 }); // 方式二:如果Activity2把extra显示在UI上,直接验证UI更贴近用户行为 onView(withId(R.id.tv_user_name)).check(matches(withText("Ray"))); onView(withId(R.id.tv_user_score)).check(matches(withText("95"))); } }
场景2:模拟完整流程——从Activity1点击按钮跳转到Activity2
这种方式测试的是真实用户操作流程,更全面:
同样在androidTest目录下创建测试类Activity1ToActivity2FlowTest:
@RunWith(AndroidJUnit4.class) public class Activity1ToActivity2FlowTest { @Test public void testButtonClickSendsCorrectIntent() { // 先启动Activity1 ActivityScenario.launch(Activity1.class); // 模拟点击按钮(替换成你Activity1里按钮的id) onView(withId(R.id.btn_jump_to_activity2)).perform(click()); // 现在Activity2已经启动,获取它的实例来检查Intent ActivityScenario<Activity2> activity2Scenario = ActivityScenario.launch(Intent.class); activity2Scenario.onActivity(activity -> { Intent receivedIntent = activity.getIntent(); assertNotNull("应该收到Intent", receivedIntent); // 这里替换成你实际传递的key和预期值 String expectedName = "Ray"; assertEquals(expectedName, receivedIntent.getStringExtra("USER_NAME")); }); // 同样可以验证UI显示是否正确 onView(withId(R.id.tv_user_name)).check(matches(withText("Ray"))); } }
一些小提醒
- 一定要保证测试里用的key和Activity1中发送Intent时的key完全一致,别写错拼写!
- 如果是用
startActivityForResult启动的Activity,测试返回结果可以用ActivityScenario.result()来处理 - 验证UI的方式更贴近真实用户体验,而直接检查Intent是更底层的逻辑验证,你可以根据需求选
内容的提问来源于stack exchange,提问作者rayobanon
相关产品推荐
相关产品推荐

