Как предоставить тестовый URL-адрес для модификации с помощью Hilt
В своем приложении я начал использовать Hilt в качестве DI. Итак, я создаю класс для модернизации своего репозитория следующим образом
@InstallIn(ApplicationComponent::class)
object RetrofitModule {
var baseUrl = "https://my.fancy.api"
@Singleton
@Provides
fun providesRetrofitClient(): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(providesOkHttpClient())
.build()
}
@Singleton
@Provides
fun providesOkHttpClient(): OkHttpClient {
val okHttpClientBuilder = OkHttpClient.Builder()
val loggingInterceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
okHttpClientBuilder.addInterceptor(loggingInterceptor)
return okHttpClientBuilder.build()
}
@Singleton
@Provides
fun providesJokeGeneratorService(retrofit: Retrofit): FancyApiService {
return retrofit.create(FancyApiService::class.java)
}
Мой вопрос, как я могу изменить URL-адрес, чтобы использовать его в Mockwebserver с Hilt?
2 ответа
Измените свой модуль с
object
к
class
и сделать
baseUrl
переменная
open
:
@InstallIn(SingletonComponent::class)
open class RetrofitModule {
open var baseUrl = "https://my.fancy.api"
@Singleton
@Provides
fun providesRetrofitClient(): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(providesOkHttpClient())
.build()
}
@Singleton
@Provides
fun providesOkHttpClient(): OkHttpClient {
val okHttpClientBuilder = OkHttpClient.Builder()
val loggingInterceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
okHttpClientBuilder.addInterceptor(loggingInterceptor)
return okHttpClientBuilder.build()
}
@Singleton
@Provides
fun providesJokeGeneratorService(retrofit: Retrofit): FancyApiService {
return retrofit.create(FancyApiService::class.java)
}
Затем просто создайте новый тестовый модуль внутри вашего тестового источника:
@Module
@TestInstallIn(
components = [SingletonComponent::class],
replaces = [RetrofitModule::class]
)
class TestRetrofitModule : RetrofitModule() {
override var baseUrl = "https://localhost:8000"
}
Если вы используете разные варианты сборки, чтобы отделить макет от реального, вы можете создать два класса с точным именем как в макете, так и в реальном пакете и экстенте. RetrofitModule
из этого класса. Затем поместите различия, такие какbaseUrl
и т.д. в этих двух классах.
class RetrofitModuleConstants {
val baseUrl = "https://my.fancy.api"
}
@InstallIn(ApplicationComponent::class)
object RetrofitModule : RetrofitModuleConstants {
...
}