Unit test two api calls within a method

1k Views Asked by At

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(..,..,..)
1

There are 1 best solutions below

1
On BEST ANSWER

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