android - 通过单元测试如何在 viewModel 中测试 switchMap 从存储库类调用正确的方法
问题描述
在我的 ViewModel 中,我使用了带有 liveData 变量的 swithcMap 作为参数。当 liveData 变量被设置/更改时,switchMap 会从我的存储库中调用一个方法。我的视图模型代码:
class MainViewModel @Inject constructor(val mainRepository: MainRepository) : ViewModel() {
var searchQuery:MutableLiveData<SearchQuery> = MutableLiveData()
var liveResult:MediatorLiveData<My_Result> = MediatorLiveData()
var apiData:LiveData<My_Result> = Transformations
.switchMap(searchQuery){query ->
query?.let {
val source: LiveData<My_Result> = mainRepository.fetchApiresultFromClient(it.filter_search , it.filter_topics, it.filter_language , it.page_number)
liveResult.addSource(source){ item->
liveResult.value = item
liveResult.removeSource(source)
}
source
}
}
}
现在我想测试一下是否设置了 searchQuery:
- switchMap 被触发
- 当 switchMap 被触发时, mainRepository.fetchApiresultFromClient(..) 被调用
- 如果 mainRepository.fetchApiresultFromClient(..) 被调用,那么返回的类型是 LiveData
我该怎么做呢?我所能做的就是:
@ExtendWith(InstantExecutorExtension::class)
class MainViewModelTest {
lateinit var mainViewModel: MainViewModel
@Mock
lateinit var mainRepository: MainRepository
@BeforeEach
fun init() {
MockitoAnnotations.initMocks(this)
mainViewModel = MainViewModel(mainRepository)
}
@Test
@Throws(Exception::class)
fun setSearchQuery_callsRepositoryMethod() {
var filter_search: SearchQuery = SearchQuery("java", "","",1)
}
}
解决方案
为了使您的代码更易于测试,您可以将其替换为:
class MainViewModel @Inject constructor(val mainRepository: MainRepository) : ViewModel() {
val searchQuery:MutableLiveData<SearchQuery> = MutableLiveData()
var apiData:LiveData<My_Result> = Transformations.switchMap(searchQuery) { query ->
query?.let {
mainRepository.fetchApiresultFromClient(it.filter_search , it.filter_topics, it.filter_language , it.page_number)
}
}
}
那么你应该
- 模拟
mainRepository.fetchApiresultFromClient
返回一个MutableLiveData
- 称呼
mainViewModel.searchQuery.value = Query(...)
- 并断言当
mainRepository
发出一个新值时apiData
也会发出相同的值。
如果您有一些测试代码要分享,我可以帮助您完成它
推荐阅读
- .net - Azure 函数内存不足
- sql - 了解联合查询
- nginx - 为什么我的 nginx 在我输入 http ip 地址时总是将我重定向到一个 url 域
- android-studio - 错误:运行 firebase deploy 时找不到模块“semver”--仅功能
- python - Jupyter Lab build: RuntimeError: npm dependencies failed to install
- api - 使用 zoom api 进行 oauth 自定义应用程序时出现 Ex 3500 代码错误
- javascript - 获取卡片对象数组并返回卡片的计数(加权值)
- javascript - Javascript中的递归函数显示NaN
- c++ - 即使在使用 skip_permission_denied 时,std::filesystem 递归迭代器也会抛出 permission_denied
- java - 在java中将不可序列化的对象转换为输入流