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

Espresso无法找到第二个Activity,启动新Activity测试失败求助

问题排查与修复方案

嘿,我帮你梳理下测试失败的几个关键原因,以及对应的修复方法:

1. ActivityMonitor初始化时机不对

你直接在类成员位置初始化Instrumentation.ActivityMonitor,这时候测试框架还没完成初始化,getInstrumentation()调用会出问题,导致后续无法正确监控SecondActivity的启动。

2. 注解位置写错了

你的@After方法被嵌套在@Test方法里面了,这是语法错误,测试框架没法正确执行清理逻辑,还会干扰整个测试流程。

3. 跳转后的View检查逻辑完全错误

跳转SecondActivity之后,你还在找LoginActivity的按钮,而且用matches(withId(R.id.first_number))这种逻辑——一个控件不可能同时匹配两个不同的ID,你应该检查SecondActivity里的目标控件才对。


修正后的完整测试代码

public class LoginActivityTest {
    @Rule
    public ActivityTestRule<LoginActivity> mActivityTestRule = new ActivityTestRule<>(LoginActivity.class);
    
    private LoginActivity loginActivity = null;
    private Instrumentation.ActivityMonitor monitor;

    @Before
    public void setUp() throws Exception {
        loginActivity = mActivityTestRule.getActivity();
        // 移到@Before里初始化,此时Instrumentation已经准备好
        monitor = getInstrumentation().addMonitor(SecondActivity.class.getName(), null, false);
    }

    @Test
    public void testLoginButtonLaunchesSecondActivity(){
        // 点击登录按钮触发跳转
        Espresso.onView(withId(R.id.email_sign_in_button)).perform(click());
        
        // 等待SecondActivity启动,超时5秒
        Activity secondActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5000);
        // 验证Activity确实启动了
        assertNotNull("SecondActivity failed to launch within timeout", secondActivity);
        
        // 检查SecondActivity中的目标控件是否正常显示(替换成你要验证的控件ID)
        Espresso.onView(withId(R.id.first_number)).check(matches(isDisplayed()));
        
        // 主动结束SecondActivity,避免影响后续测试
        if (secondActivity != null) {
            secondActivity.finish();
        }
    }

    @After
    public void tearDown() throws Exception {
        // 清理monitor资源
        getInstrumentation().removeMonitor(monitor);
        loginActivity = null;
    }
}

额外优化建议

  • 确保SecondActivity在AndroidManifest.xml里正确注册,不然跳转本身就会失败,测试肯定通不过。
  • 如果登录按钮需要先输入账号密码才可以点击,记得在测试里先添加输入逻辑,比如:
    Espresso.onView(withId(R.id.email)).perform(typeText("test@example.com"));
    Espresso.onView(withId(R.id.password)).perform(typeText("123456"), closeSoftKeyboard());
    
  • 用Espresso的Intents API可以更优雅地验证跳转,不需要手动管理ActivityMonitor:
    // 需要添加依赖:androidx.test.espresso:espresso-intents
    @Test
    public void testLoginButtonIntent() {
        Intents.init();
        Espresso.onView(withId(R.id.email_sign_in_button)).perform(click());
        // 验证是否跳转到了SecondActivity
        intended(hasComponent(SecondActivity.class.getName()));
        Intents.release();
    }
    

内容的提问来源于stack exchange,提问作者ken4ward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:31:39