Я попытался выполнить 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'