android - 当我们在 ViewModel 中延迟加载 LiveData 时进行单元测试
问题描述
我们有以下ViewModel代码:
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData().also {
loadUsers()
}
}
fun getUsers(): LiveData<List<User>> {
return users
}
private fun loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
我想对此代码进行单元测试:
@Test
fun loadUsers() {
val user= User("name")
val observableResponse =
Observable.just(api.UserWrapper(Lists.newArrayList(user)))
`when`(api.loadUsers()).thenReturn(observableResponse)
with(viewModel) {
with(this.users.value!!) {
assertFalse(isEmpty())
assertTrue(size == 1)
}
}
}
但它没有通过测试。这是由于延迟加载:
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData().also {
loadUsers()
}
}
有什么解决办法?
这是错误:
NullPointerException
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.reactivex.Observable.subscribe(Observable.java:12034)
at io.reactivex.Observable.subscribe(Observable.java:12016)
at io.reactivex.Observable.subscribe(Observable.java:11945)
at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2.invoke(DetailViewModel.kt:25)
at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2.invoke(DetailViewModel.kt:12)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at com.sample.android.tmdb.ui.detail.DetailViewModel.get_cast(DetailViewModel.kt)
at com.sample.android.tmdb.ui.detail.DetailViewModel.access$get_cast$p(DetailViewModel.kt:12)
at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2$$special$$inlined$also$lambda$4.accept(DetailViewModel.kt:26)
at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2$$special$$inlined$also$lambda$4.accept(DetailViewModel.kt:12)
解决方案
推荐阅读
- nullpointerexception - 空手道 API - Runner.runFeature 返回 null 导致负载测试崩溃
- c - 动态结构内的动态 strct 数组
- python - 如何将数据框字符串列拆分为三列?x 作为“分隔符”
- html - 如何为 docusaurus 中的文件创建下载链接?
- node.js - 无法使用快速会话将用户信息传递到不同的路线?
- php - ImageMagick php 的图像分辨率
- java - 是否有另一个库可以允许写入文档(例如日志)“日期”类型,因为 FileOutputStream 不允许它?
- deployment - 是否可以在不关联现有 GitHub 项目的情况下创建新的 Cloudflare Pages 项目?
- mysql - 带有 LIKE 字符串的 MySQL 案例语句
- laravel - 未加入状态室的用户数