使用Mockito、mock repository.obsobserveValue()进行Android MVVM测试时



我正在尝试用Mockito测试MVVM
MVVM的架构与Android架构蓝图相似。

我们将存储库中的数据视为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,尽管我使用了mockito。

问题

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()
}

查看更多

相关内容

  • 没有找到相关文章

最新更新