import retrofit2.Call import retrofit2.Retrofit import retrofit2.http.GET import retrofit2.http.Path import retrofit2.mock.BehaviorDelegate import retrofit2.mock.MockRetrofit import retrofit2.mock.NetworkBehavior class MyApp { var retrofit: Retrofit = Retrofit.Builder() .baseUrl("https://api.github.com/") .build() var service: NetworkBackedApiService? = null fun appStart() { //PRETEND THIS IS DI val IN_MOCK_MODE = true if (IN_MOCK_MODE) { val networkBehavior = NetworkBehavior.create() val mockRetrofit = MockRetrofit.Builder(retrofit).networkBehavior(networkBehavior).build() val delegate = mockRetrofit.create(NetworkBackedApiService::class.java) service = MockApiService(delegate) } else { service = retrofit.create(NetworkBackedApiService::class.java) } //At this point, this is what we want. We don't care if this is prod or real service?.getFullName("blah") } } interface NetworkBackedApiService { @GET("top/repo/names") fun getFullName(@Path("user") user: String?): Call? } class MockApiService(delegate: BehaviorDelegate) : NetworkBackedApiService { private val delegate: BehaviorDelegate = delegate override fun getFullName(user: String?): Call? { return FakeCall("Colton Idle") ==============> Not sure what goes here } }