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

如何对LiveData Transformations中的业务逻辑进行单元测试

测试ViewModel中Transformations.map的业务逻辑(MockK版)

针对你遇到的问题,我来一步步拆解如何用MockK完成这个单元测试,重点验证_sampleLiveDataIwannaTest的赋值逻辑:

1. 修正测试环境配置

首先确保你的ViewModel构造函数依赖MyRepository(这样才能通过MockK注入模拟对象),然后在测试类中正确初始化MockK和ViewModel:

class MyViewModelTest {
    @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()

    @RelaxedMockK lateinit var myRepository: MyRepository
    private lateinit var sut: MyViewModel
    // 定义一个可控的LiveData,用来模拟myRepository.streamingData的输出
    private val testStreamingData = MutableLiveData<Foo>()

    @Before fun setUp() {
        MockKAnnotations.init(this)
        // 手动初始化ViewModel,传入模拟的Repository
        sut = MyViewModel(myRepository)
        // 让myRepository.streamingData返回我们可控的testStreamingData
        every { myRepository.streamingData } returns testStreamingData
    }
}

2. 编写核心测试逻辑

接下来,我们需要触发Transformations.map的执行,并断言目标LiveData的值:

@Test fun `when streamingData updates, sampleLiveDataIWannaTest should get sum of first and last element`() {
    // 关键:必须观察转换后的LiveData(liveDataImNotInterestedIn),否则Transformations.map不会执行
    sut.liveDataImNotInterestedIn.observeForever {}

    // 1. 给模拟的streamingData设置测试值(假设Foo有firstElementValue和lastElementValue属性)
    val testFoo = Foo(firstElementValue = 2, lastElementValue = 3)
    testStreamingData.value = testFoo

    // 2. 断言目标LiveData的值是否符合预期(2+3=5)
    assertEquals(5, sut.sampleLiveDataIWannaTest.value)
}

关键注意点

  • Transformations的懒加载特性:只有当转换后的LiveData(liveDataImNotInterestedIn)被观察时,才会监听源LiveData(myRepository.streamingData)的变化并执行map逻辑,所以必须添加observeForever {}(测试结束后可以移除观察者避免内存泄漏,不过单元测试结束后会销毁实例,也可以忽略)。
  • InstantTaskExecutorRule的作用:这个规则会让LiveData的所有操作在同一个线程执行,确保postValue的结果能立即被获取,不需要异步等待。
  • MockK的模拟方式:用every { myRepository.streamingData } returns testStreamingData来让Repository返回我们可控的LiveData,这样就能手动触发数据变化。

关于Transformations.switchMap的测试

你推测的没错,switchMap的测试逻辑基本一致:只需要模拟源LiveData返回不同的LiveData实例,然后验证转换后的结果或者相关业务逻辑即可,核心都是控制源LiveData的输出,观察目标LiveData的变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:42:40