[英]How to Unit Test MVVM with Koin?
如何使用 Koin 對 MVVM 進行單元測試?
我嘗試測試: 鏈接
但是,我不知道為什么error("No Data in ViewModel")
fun getLookUpLeagueList()
存儲庫
class LookUpLeagueRepository {
fun getLookUpLeague(idLeague: String): MutableLiveData<LookUpLeague> {
val lookUpLeague = MutableLiveData<LookUpLeague>()
APIService().getLookUpLeague(idLeague).enqueue(object : Callback<LookUpLeague> {
override fun onFailure(call: Call<LookUpLeague>, t: Throwable) {
d("TAG", "lookUpLeagueOnFailure ${t.localizedMessage}")
}
override fun onResponse(call: Call<LookUpLeague>, response: Response<LookUpLeague>) {
lookUpLeague.value = response.body()
}
})
return lookUpLeague
}
}
視圖模型
class LookUpLeagueViewModel(private val lookUpLeagueRepository: LookUpLeagueRepository) :
ViewModel() {
var lookUpLeagueList = MutableLiveData<LookUpLeague>()
fun getLookUpLeagueList(idLeague: String) {
lookUpLeagueList = lookUpLeagueRepository.getLookUpLeague(idLeague)
}
}
模塊
val lookUpLeagueModule = module {
single { LookUpLeagueRepository() }
viewModel { LookUpLeagueViewModel(get()) }
}
視圖模型測試
class LookUpLeagueViewModelTest : KoinTest {
val lookUpLeagueViewModel: LookUpLeagueViewModel by inject()
val idLeague = "4328"
@get:Rule
val rule = InstantTaskExecutorRule()
@Mock
lateinit var observerData: Observer<LookUpLeague>
@Before
fun before() {
MockitoAnnotations.initMocks(this)
startKoin {
modules(lookUpLeagueModule)
}
}
@After
fun after() {
stopKoin()
}
@Test
fun getLookUpLeagueList() {
lookUpLeagueViewModel.lookUpLeagueList.observeForever(observerData)
lookUpLeagueViewModel.getLookUpLeagueList(idLeague)
val value = lookUpLeagueViewModel.lookUpLeagueList.value ?: error("No Data in ViewModel")
Mockito.verify(observerData).onChanged(value)
}
}
@Test
fun getLookUpLeagueList() {
lookUpLeagueViewModel.lookUpLeagueList.observeForever(observerData)
...
}
這時lookUpLeagueList
是實例MutableLiveData
。 假設這是MutableLiveData #1
。
lookUpLeagueViewModel.getLookUpLeagueList(idLeague)
執行上面的行將調用LookUpLeagueViewModel.getLookUpLeagueList
函數。 讓我們來看看它的內部。
lookUpLeagueList = lookUpLeagueRepository.getLookUpLeague(idLeague)
在MutableLiveData
中創建了一個全新的LookUpLeagueRepository
。 這與observerData
正在觀察的一個不同。 此時lookUpLeagueViewModel.lookUpLeagueList
指的是新的MutableLiveData #2
因為您將它重新分配給var lookUpLeagueList
。
val value = lookUpLeagueViewModel.lookUpLeagueList.value ?: error("No Data in ViewModel")
因此,您實際上是在查詢新的、未觀察到的、空的MutableLiveData #2
。 這就是value
為null
的原因。 與其聲明為var
,不如將其聲明為val
。 不要重新分配變量、 setValue
或postValue
以傳播更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.