使用Mockito进行的Android MVVM测试,模拟repository.observeValue有问题 问题第一个解决方案

问题描述

我正在尝试使用Mockito测试MVVM。
MVVM的架构类似于Android architecture blueprints

我们观察到来自存储库的数据为LiveData。
并尝试像下面的代码一样测试观察值。

class Splashviewmodel(
    private val appRepository: AppRepository
) {
    val appInfo: LiveData<AppInfo> = appRepository.observeAppInfo()
}

@Test
fun getAppInfo() {
    `when`(appRepository.observeAppInfo())
        .thenReturn(appInfoData)

    assertEquals(appInfoData,viewmodel.appInfo.getorAwaitValue())
}

关键点是viewmodel.appInfo返回null,尽管我使用了模仿。

问题

创建viewmodel的速度比使用Mockito快。
因此,appInfo属性使用null初始化,导致它不知道observeAppInfo()是什么。

一个解决方

首先,我只是尝试使用自定义getter解决此问题。这样。

class Splashviewmodel(
    private val appRepository: AppRepository
) {
    val appInfo: LiveData<AppInfo> get() = appRepository.observeAppInfo()
}

现在,每次我访问appInfo时,它们都会重新评估数据。
但这是它自己的问题。

在这种情况下,appVersion出现错误

val appVersion: LiveData<String> = appInfo.map { 
    ...
}

因此,每个转换LiveData(例如Transformations,MediatorLiveData)也必须使用自定义getter。
而且我觉得这不是一个很好的解决方案。

您怎么看?

解决方法

您可以使用@BeforeClass来确保初始化在测试之前运行。

@BeforeClass
fun setup(){
   appInfo = appRepository.observeAppInfo()
}

See more