Robolectric → 分层测试:测试策略重构

Robolectric → 现代替代

老写法(Java + Robolectric)

java 复制代码
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {

    @Test
    public void clickButton_updatesText() {
        MainActivity activity = Robolectric.buildActivity(MainActivity.class)
                .create().start().resume().get();
        activity.findViewById(R.id.btn_action).performClick();
        TextView tv = activity.findViewById(R.id.tv_result);
        assertEquals("已更新", tv.getText().toString());
    }
}

问题在哪里

Robolectric 模拟了整个 Android 框架,每次运行加载影子类(Shadow)耗时很长。不同 Android SDK 版本的 shadow 实现差异大,升级 Android 版本时测试经常大量挂掉。大部分团队花在 Robolectric 测试维护上的时间远超它能发现的问题。

新写法(分层测试策略)

kotlin 复制代码
// 1. 单元测试 --- 测 ViewModel,不测 Activity
class MainViewModelTest {
    @Test
    fun `updateData refreshes list`() = runTest {
        val vm = MainViewModel(fakeRepo)
        vm.updateData()
        assertEquals(3, vm.items.value?.size)
    }
}

// 2. Compose Testing --- 测 UI 逻辑
@Test
fun `click button shows updated text`() = runTest {
    composeTestRule.setContent { MyScreen(viewModel) }
    composeTestRule.onNodeWithTag("btn_action").performClick()
    composeTestRule.onNodeWithTag("tv_result").assertTextEquals("已更新")
}

// 3. 端到端 --- 用 Espresso 或手动在真机上跑

一句话注意

Robolectric 的核心问题------它试图让你相信可以在 JVM 上测试 Android 依赖------但在实践中,维护 Robolectric 测试的成本往往高于收益。更好的替代方案是:

  1. 把业务逻辑抽到 ViewModel/UseCase,用纯 JUnit + MockK 测(快、稳定)
  2. UI 逻辑用 Compose Testing 测(不依赖设备、也快)
  3. 集成测试用真机/模拟器上的 Espresso 跑(慢但可靠,放在 CI 的 nightly build)

Robolectric 的存在意义正在被 Compose Testing + 更好的分层架构替代。


Java Android 老项目迁移系列,持续更新中。

相关推荐
Joy T3 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383006 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·6 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停7 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金9 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck10 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog10 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
geovindu10 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
Wang's Blog10 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网11 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python