Android 如何从viewModel内部模拟存储库和apiClient

Android 如何从viewModel内部模拟存储库和apiClient,android,kotlin,mockito,Android,Kotlin,Mockito,我有一个MainViewModel: class MainViewModel @Inject constructor(val mainRepository: MainRepository) : ViewModel() { ..... val source: LiveData<GenericApiResponse<GitResult>> = mainRepository.fetchApiresultFromClient(str_query) } 我模仿MainRep

我有一个MainViewModel

 class MainViewModel @Inject constructor(val mainRepository: MainRepository) : ViewModel() {
.....
val source: LiveData<GenericApiResponse<GitResult>> = mainRepository.fetchApiresultFromClient(str_query)  
}

我模仿
MainRepository
MainApiClient
是否做错了什么。做这件事的正确方法是什么?

总的来说,我会说是的。你不应该嘲笑你正在测试的东西。我的问题是,为什么要从视图模型测试存储库?如果您正在进行单元测试,那么应该对存储库进行隔离测试。您所描述的那种测试实际上是单独测试存储库的一个很好的候选者。@Fred:对不起,我是测试新手。但我的困惑是,如果我需要孤立地测试所有内容,那么我如何知道从存储库中的方法返回到viewmodel的内容呢。如果我也必须模拟结果,然后对其进行断言,那又有什么意义呢?通常这是通过验证交互来完成的。使用mockito,您可以检查是否从视图模型调用了存储库。然后通过对存储库进行单元测试,您可以确定它会返回它想要返回的内容。当你把事情放在一起时,大家的共识是它们应该是有效的。如果您一起测试所有内容,我认为这更多地属于集成测试领域。如果你想让我用一个例子来回答你的问题,那就是它不能回答你的问题…@Fred:谢谢你的回答。好的,我想我知道单独做测试是个好主意。但我可以用原始结果进行测试吗?假设在我的MainApiClient中,我通过在mainAPi中进行改装从webservice调用中获得结果。那么,我可以通过不模拟结果在MainapClient中测试webservice结果是成功还是错误吗?好的,我们的想法是实际模拟结果,这样就可以模拟成功和失败。
class MainRepository @Inject constructor(val mainApiClient: MainApiClient) {
    ....
    fun fetchApiresultFromClient(strQuery: String)
     : LiveData<GenericApiResponse<GitResult>> {

      var returnedData =    mainApiClient.getApiResultFromServer(strQuery)
      return returnedData
     }
class MainApiClient  @Inject constructor(val mainApi: MainApi) {

   fun getApiResultFromServer(query :String )
        : LiveData<GenericApiResponse<GitResult>> {

    var apiResult =   mainApi.getAllRepo(query)

       return apiResult

    }
}
@ExtendWith(InstantExecutorExtension::class)
class MainViewModelTest {

    lateinit var  mainViewModel: MainViewModel

    @Mock
     lateinit var  mainRepository: MainRepository

    @Mock
    lateinit var  mainApiClient: MainApiClient


    @BeforeEach
    fun init()
    {
    MockitoAnnotations.initMocks(this)
    mainViewModel = MainViewModel(mainRepository)
    }

    @Test
    fun setSearchQuery_callsRepositoryMethod_returnSuccess() {

           //arrange
         mainViewModel.liveResult.value = ApiSuccessResponse(TestUtil.obj_gitresult) as GenericApiResponse<GitResult>

        Mockito.`when`(mainApiClient.getApiResultFromServer(ArgumentMatchers.anyString(), ArgumentMatchers.anyInt()))
            .thenReturn(mainViewModel.liveResult)


           //act

        var repo_response = mainRepository.fetchApiresultFromClient("java")


        //assert
           // assertTrue(repo_response.value is  GenericApiResponse<GitResult> ) //for asserting return type is of type GenericResponse //--TestResult- java.lang.NullPointerException
           // assertTrue(repo_response.value is  ApiSuccessResponse<GitResult> ) //for asserting return type is of type ApiSuccessResponse //--TestResult- java.lang.NullPointerException
           //  assertEquals(mainViewModel.liveResult.value , repo_response.value ) //for asserting 2 generic types are equal //--TestResult- java.lang.NullPointerException
        }

}