androidmockitopowermockitoandroid-unit-testing

Unit test two api calls within a method


I have a method that makes an API call and if an error occurs it will retry the call with a different instance of the same service API.

        var getResponse = myApi?.getCodeApi()
        if (getResponse?.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
            // Retrying with instance of service with a different token
            getResponse = newMyApiService?.getCodeApi()

        }
        checkResponse(getResponse)

What is the right way to unit test the above code?. I tried something like this and it does not seem to work.

    whenever(myAPi.getCodeApi()).thenReturn(properResponse)
    val errorResponse : Response<DataModel> = mock()
    whenever(response.code()).thenReturn(HttpsURLConnection.HTTP_UNAUTHORIZED)
    whenever(myAPi.getCodeApi()).thenReturn(errorResponse)
    test.callMethod()
    assertValues(..,..,..)

Solution

  • I would test the above the code in below ways, i use mockito kotlin but i think this will help for what you are looking for i:e; right way ( that is subjective) :

      @Test
            fun `retry with newMyApiService when myAPI returns HTTP_UNAUTHORIZED`() {
                myApi.stub {
                on { 
                    getCodeApi() } doReturn Erorr_Response_Model
                }
    newMyApiService.stub {
                on { 
                    getCodeApi() } doReturn Response_Model
                }
                test.callMethod();
                verify(newMyApiService, times(1)). getCodeApi()
    Assertions.assert(..Above Response_Model )
            }
    

    And a test to make sure that newAPIService does not always get called:

    @Test
                fun `myApi should return the valid result without retrying`() {
                    myApi.stub {
                    on { 
                        getCodeApi() } doReturn SuccessModel
                    }
       
                    test.callMethod();
                    verify(newMyApiService, times(0)). getCodeApi()
                    verify(myApi, times(1)). getCodeApi()
        Assertions.assert(..SuccessModel )
                }