mocking actual API call during unittesting retrofit interface

Viewed 44

learning about retrofit but couldn't write the tests for it. I came from jest background and struggling to test two things:

that the call was making to a specific end point and its status.

import okhttp3.ResponseBody
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query

interface WeatherAPI {

    @GET("current.json")
    suspend fun getCurrentWeatherData(@Query("key") apiKey: String, @Query("q") cityName: String, @Query("qui") quiValue: String): Response<ResponseBody>

    companion object {
        private const val BASE_URL = "http://api.weatherapi.com/v1/"
        val instance: WeatherAPI by lazy {
            Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(WeatherAPI::class.java)

        }
    }
}

Test file:

class WeatherAPITest {

    @Test
    fun WeatherAPI_getCurrentWeather_apiKey_city(){
        runBlocking {

           val res = WeatherAPI.instance.getCurrentWeatherData("123", "London", "no")
            assertThat(res.code()).isEqualTo(200)

        }


    }
}

it fails because there is no token. How can i mock the actual api call to return say 200 on the test and confirm something like this:

 assertThat(url).isEqualTo('http:....?key=123&q=London')
 assertThat(responseCode).isEqualTo(200)
0 Answers
Related