首页 > 解决方案 > Mvvm Coroutine Mockito 测试 ViewModel 给出错误

问题描述

我测试视图模型的测试用例如下所示:

@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"))
    }
}

在第一个测试用例中成功运行,但是当它运行第二个时出现此错误:

需要但未调用: userObserver.onChanged( Resource(status=ERROR, data=null, message=Some error) ); -> 在 com.android.loginapp.viewmodel.LoginActivityViewModelTest$check user response when get unsuccessful response from server$1.invokeSuspend(LoginActivityViewModelTest.kt:83)

但是,与此模拟只有 1 次交互: userObserver.onChanged( Resource(status=LOADING, data=null, message=null) ); -> 在 androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)

我的 viewModel 网络调用方法如下所示:

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()))
        }
    }
}

不知道为什么它会给出这个错误。

标签: androidunit-testingmvvmmockitokotlin-coroutines

解决方案


我需要使用.thenThrow(RuntimeException("test error")),只有它会通过。


推荐阅读