Kotlin Coroutines ViewModel Unit Testing с Mockito с использованием Retrofit MVVM генерирует нулевой указатель Исключение - PullRequest
0 голосов
/ 01 мая 2020


Я попытался выполнить UnitTest моей ViewModel, которая использует сопрограммы Kotlin для выполнения вызова Retrofit API. Модульный тест завершается с ошибкой нулевого указателя.
При попытке выполнить то же самое с Retrofit RX JAva UnitTest Passes. Используется Mockito Framework.
Пожалуйста, просмотрите мой код и сообщите мне об ошибке, которая допущена в моем коде.
Ниже приведены файлы классов ViewModel и UnitTest:
fetchResponseFromAPI () метод вызывает API для извлечения данных
RetroCoroutineViewModel.kt :

 class RetroCoroutineViewModel  : ViewModel(),LifecycleObserver{

private val errorOnAPI = MutableLiveData<String>()
private val mutableLiveData:MutableLiveData<List<RetroRxModel>> = MutableLiveData()
var loading : MutableLiveData<Boolean> = MutableLiveData()

@Inject
lateinit var retrofit: Retrofit
lateinit var apiService: APIService

init {
    DaggerRetroRxComponent.create().inject(this)
    loading.value = true
    apiService = retrofit.create(APIService::class.java)
}



 val postsMutableLiveData:MutableLiveData<List<RetroRxModel>> = MutableLiveData()

**@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun fetchResponseFromAPI(){**
    viewModelScope.launch {

        try{

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



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

    }

}

fun fetchPostLiveData(): LiveData<List<RetroRxModel>>  = postsMutableLiveData


override fun onCleared() {
    super.onCleared()

}


fun fetchError(): LiveData<String> = errorOnAPI



fun fetchLoadStatus():LiveData<Boolean> = loading

    private  fun onError(message: String){
       errorOnAPI.value = message
       loading.value = false


     }
     }

RetroCoroutineViewModelTest:

@RunWith(MockitoJUnitRunner::class)
@ExperimentalCoroutinesApi
   class RetroCoroutineViewModelTest {
@get:Rule
val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()

@get:Rule
val testCoroutineRule = TestCoroutineRule()

@Mock
lateinit var retrofit: Retrofit

@Mock
lateinit var apiService: APIService

lateinit var retroCoroutineViewModel: RetroCoroutineViewModel

private lateinit var response: Response<List<RetroRxModel>>

private  var loading: Boolean = false

      @Before
     fun setUp(){
       MockitoAnnotations.initMocks(this)

      } 



       @Test
       fun fetchRetroInfoTest_success(){
       retroCoroutineViewModel = RetroCoroutineViewModel()
        testCoroutineRule.runBlockingTest {
        var retroRxModel = RetroRxModel("tile", "body", "1")
        var retroRXModelList = ArrayList<RetroRxModel>()
        retroRXModelList.add(retroRxModel)
        response = Response.success(retroRXModelList)
        if (retrofit != null) {

            if (apiService != null) {
                Mockito.`when`(apiService.fetchUserPosts()).thenReturn(response)
                retroCoroutineViewModel.fetchResponseFromAPI()

            }
        }
        val funResponse = retroCoroutineViewModel.fetchPostLiveData()
        println("Response::::${funResponse.value}")

         Assert.assertEquals(1,funResponse.value?.size)
        Assert.assertEquals(loading,retroCoroutineViewModel.loading)



    }
}

}


Я наблюдаю ниже исключения, когда пытаюсь запустить пример модульного теста:

java .lang.AssertionError: Ожидаемый: 1 Фактический: ноль

at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:118)
at org.junit.Assert.assertEquals(Assert.java:144)
at com.rxretrofit.RetroCoroutineViewModelTest$fetchRetroInfoTest_success$1.invokeSuspend(RetroCoroutineViewModelTest.kt:75)

Build.Gradle:

    testImplementation "org.mockito:mockito-core:3.3.3"   
    testImplementation 'androidx.arch.core:core-testing:2.1.0'
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.4'
...