我正在尝试用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()
}
查看更多