问题描述
我正在尝试使用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()
是什么。
第一个解决方案
class Splashviewmodel(
private val appRepository: AppRepository
) {
val appInfo: LiveData<AppInfo> get() = appRepository.observeAppInfo()
}
现在,每次我访问appInfo时,它们都会重新评估数据。
但这是它自己的问题。
val appVersion: LiveData<String> = appInfo.map {
...
}
因此,每个转换LiveData(例如Transformations,MediatorLiveData)也必须使用自定义getter。
而且我觉得这不是一个很好的解决方案。
您怎么看?
解决方法
您可以使用@BeforeClass
来确保初始化在测试之前运行。
@BeforeClass
fun setup(){
appInfo = appRepository.observeAppInfo()
}