Kotlin Coroutine ViewModel UnitTesting не распространяется на модель представления - PullRequest
1 голос
/ 01 мая 2020


У меня проблемы с передачей Coroutine UnitTestcase для ViewModel. Я использую модификацию MVVM.
Несмотря на то, что я смоделировал результат, он отображает результат как "null"
Ниже приведен класс случая UnitTest:

val testDispatcher = TestCoroutineDispatcher()
@Test
fun `check viewmodel fetches data correctly`() = testDispatcher.runBlockingTest{
    var retroRxModel = RetroRxModel("tile", "body", "1")
    var retroRXModelList = ArrayList<RetroRxModel>()
    retroRXModelList.add(retroRxModel)
    response = Response.success(retroRXModelList)
    retroCoroutineViewModel = RetroCoroutineViewModel(testDispatcher)
    if (retrofit != null) {

        if (apiService != null) {
            Mockito.`when`(apiService.fetchUserPosts()).thenReturn(response)
        }
    }
    retroCoroutineViewModel.fetchResponseFromAPI()
    println("Loading Val::::${retroCoroutineViewModel.fetchLoadStatus()?.value}")
    println("PostLive Dat::::${retroCoroutineViewModel.fetchPostLiveData().value}")
    Assert.assertEquals(true,retroCoroutineViewModel.loading?.value)



}


Пожалуйста, найдите viewmodel проверяемый метод:

fun fetchResponseFromAPI(){
    viewModelScope.launch (dispatcher){
       // postsMutableLiveData.postValue(null)
        try{

            val response  = apiService.fetchUserPosts()
            if(response.isSuccessful){
                postsMutableLiveData.postValue(response.body())
                loading.postValue(false)
               // loading.value = false
            }else{
                loading.postValue(false)
                errorOnAPI.postValue("Something went wrong::${response.message()}")
            }



        }catch (e:Exception){
            loading.postValue(false)
            errorOnAPI.postValue("Something went wrong::${e.localizedMessage}")
        }

    }

}

ViewModelFactory:

class RetroCoroutineViewModelFactory : ViewModelProvider.Factory {
@ExperimentalStdlibApi
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    if (modelClass.isAssignableFrom(RetroCoroutineViewModel::class.java)) {
        return RetroCoroutineViewModel(Dispatchers.Main) as T
    }
    throw IllegalArgumentException("Unknown ViewModel class")
}


}


При попытке запустить unittest я вижу элемент управления возвращается после выполнения приведенной ниже строки в ViewModel без выполнения другого кода, хотя данные проверяются:
val response = apiService.fetchUserPosts ()

Пожалуйста, помогите мне в решении этой проблемы.
Я использую Mockito Framework

1 Ответ

1 голос
/ 01 мая 2020

Поскольку retroCoroutineViewModel не использует макетированный экземпляр apiService.

Создается объект viewmodel и выполняется макет apiService (с учетом выполнения ifs), но объект apiService в объекте retroCoroutineViewModel отличается от макетированного экземпляра, поэтому вы необходимо убедиться, что объект retroCoroutineViewModel имеет макетированный apiService объект вашего сервиса (передать apiService через конструктор в RetroCoroutineViewModel?)

...