0

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(..,..,..)
abhishek maharajpet
  • 482
  • 1
  • 4
  • 18

1 Answers1

2

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 )
            }
Manikanta
  • 3,421
  • 4
  • 30
  • 51
  • my newAPIService is being injected via Koin in unit test and also in the method. The second API call with newAPIService always returns null when testing via unit test hence resulting in my unit test failure – abhishek maharajpet Jan 25 '21 at 08:42