Tuesday, 9 February 2021

Mvvm Coroutine Mockito testing ViewModel giving error

My test case to test the viewmodel looks like this :

@Before
fun setUp() {
    loginActivityViewModel = LoginActivityViewModel(loginRepository)
        .apply { users.observeForever(userObserver) }
}

@Test
fun `check user response when get successful response from server`() {
    testCoroutineRule.runBlockingTest {
        //Given
        whenever(loginRepository.getLoginResponse(loginRequest)).then(Answer { loginResponse })

        //When
        loginActivityViewModel.loginResponse(loginRequest)

        //Then
        verify(userObserver).onChanged(Resource.loading(data = null))
        verify(userObserver).onChanged(Resource.success(data = loginResponse))
    }
}

@Test
fun `check user response when get unsuccessful response from server`() {
    testCoroutineRule.runBlockingTest {
        //Given
        whenever(loginRepository.getLoginResponse(loginRequest)).thenThrow(Error("Some error"))

        //When
        loginActivityViewModel.loginResponse(loginRequest)

        //Then
        verify(userObserver).onChanged(Resource.loading(data = null))
        verify(userObserver).onChanged(Resource.error(message = "Some error"))
    }
}

Inside this first test case run successfully but when it run 2nd one giving this error:

Wanted but not invoked: userObserver.onChanged( Resource(status=ERROR, data=null, message=Some error) ); -> at com.android.loginapp.viewmodel.LoginActivityViewModelTest$check user response when get unsuccessful response from server$1.invokeSuspend(LoginActivityViewModelTest.kt:83)

However, there was exactly 1 interaction with this mock: userObserver.onChanged( Resource(status=LOADING, data=null, message=null) ); -> at androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)

My viewModel network calling method look like this:

fun loginResponse(loginRequest: LoginRequest) {
    viewModelScope.launch {
        users.postValue(Resource.loading(null))
        try {
            val usersFromApi = loginRepository.getLoginResponse(loginRequest)
            users.postValue(Resource.success(usersFromApi))
        } catch (e: Exception) {
            users.postValue(Resource.error(e.message.toString()))
        }
    }
}

Not sure why it's giving this error.



from Mvvm Coroutine Mockito testing ViewModel giving error

No comments:

Post a Comment