Mocking the retrofit API calls using MockWebServer

23 views Asked by At

I am trying to write test cases for network layer for my android application for retrofit api call. I am using mockWebServer for mocking the api calls. However I am not able to receive the correct mockresponse instead it gives socket timeout exception

Below is my code:

@RunWith(MockitoJUnitRunner::class)
class SampleApiClientTest {

    @get: Rule
    val rule = InstantTaskExecutorRule()

    private lateinit var mockWebServer: MockWebServer
    private lateinit var sampleApiClient: SampleApiClient
    private lateinit var retrofit: Retrofit
    @Mock
    lateinit var helper: SharedPreferencesHelper
    @Mock
    private lateinit var authHeader: IAuthHeader

    @Before
    fun setUp(){
        mockWebServer = MockWebServer()
        retrofit = Retrofit.Builder()
            .baseUrl(mockWebServer.url("/"))
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        Mockito.`when`(helper.getBaseUrl()).thenReturn(mockWebServer.url("/").toString())
        APIClientProvider.buildNetworkProvider(true, helper)
        sampleApiClient = SampleApiClient()
    }

    @After
    fun tearDown() {
        mockWebServer.shutdown()
    }

    @Test
    fun testSample(){
        runBlocking {
            val request = SanpleRequest("","")
            sampleApiClient.apiClient = retrofit.create(SampleApi::class.java)

            mockWebServer.enqueue(MockResponse().setBody("[]"))
        
            val result = sampleApiClient.sample(authHeader,request)
            mockWebServer.takeRequest()
            Assert.assertEquals(200,result.body())
        }
    }
}


class SampleApiClient : SampleApi {

    lateinit var apiClient : SampleApi
    override suspend fun sample(
        authHeader: IAuthHeader,
        request: SanpleRequest
    ): Response<SampleResponse?> {
        apiClient = APIClientProvider.createService(SampleApi::class.java)
        return apiClient.sample(authHeader,request)
    }
}

interface SampleApi {

    @POST("V003/Sample?format=json")
    suspend fun sample(
        @Tag authHeader : IAuthHeader,
        @Body request: SampleRequest
    ): Response<SampleResponse?>
}

How do I achieve this?

0

There are 0 answers