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

测试领域中“stub”的含义是什么?结合Espresso代码示例解析

测试语境中"Stub"的含义及Espresso中的具体作用

先给你掰明白测试里的Stub(桩)是什么:它就是一个用来替代真实依赖组件的模拟对象,你可以提前给它预设好返回结果或者行为,这样在测试的时候,你的代码调用这个依赖组件时,不会真的去执行它的真实逻辑,而是直接用Stub预设的响应。这么做的好处太多了——比如避免测试依赖外部系统、让测试更快更稳定,还能精准控制返回值来覆盖不同的测试场景。

接下来咱们结合你给出的两段Espresso代码,看看它具体怎么用:

1. 拦截所有外部Intent的Stub

@Before 
public void stubAllExternalIntents() { 
    // By default Espresso Intents does not **stub** any Intents. Stubbing needs to be setup before 
    // every test run. In this case all external Intents will be blocked. 
    intending(not(isInternal())).respondWith(new ActivityResult(Activity.RESULT_OK, null)); 
}

这段代码是在每个测试用例执行前(@Before注解的方法)设置的Stub:

  • Espresso的Intents框架默认不会自动Stub任何Intent,所以必须手动配置。
  • 这里的intending(not(isInternal()))表示“拦截所有非本应用内部的Intent”——比如你的App要打开系统浏览器、相机这类外部应用的Intent都会被拦下。
  • 然后用respondWith给这些被拦截的Intent预设一个响应:返回Activity.RESULT_OK的结果,同时不携带任何数据。这样测试过程中,App不会真的跳转到外部应用,测试流程不会被打断,也不用依赖外部应用的状态。

2. 针对特定Activity的Stub

@Test 
public void pickContactButton_click_SelectsPhoneNumber() { 
    // **Stub** all Intents to ContactsActivity to return VALID_PHONE_NUMBER. Note that the Activity 
    // is never launched and result is stubbed. 
    intending(hasComponent(hasShortClassName(".ContactsActivity"))) 
        .respondWith(new ActivityResult(Activity.RESULT_OK, ContactsActivity.createResultData(VALID_PHONE_NUMBER))); 
}

这段是针对特定业务场景的Stub:

  • 当测试“点击选择联系人按钮”这个功能时,正常逻辑是会启动ContactsActivity让用户选联系人,然后返回选中的手机号。
  • 但这里用Stub直接拦截了启动ContactsActivity的Intent,完全不会真的启动这个Activity,而是直接返回预设好的VALID_PHONE_NUMBER作为结果。
  • 这样测试就能专注验证:点击按钮后,App是否正确处理了返回的手机号(比如显示在输入框里),而不用关心ContactsActivity的真实功能是否正常,也不用手动去操作选联系人,测试效率和稳定性都大大提升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:47:10