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?