我正在尝试从TestComponent获取OkHttp的实例,我有此设置
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
RetrofitModule::class]
)
interface TestAppComponent : AndroidInjector<TestApp> {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: TestApp): TestAppComponent
}
}
然后我的TestApp是
open class TestApp : App() {
override fun onCreate() {
super.onCreate()
DaggerTestAppComponent.factory()
.create(this)
.inject(this)
}
}
它可以工作,但是东西在我的AbstractBaseTest上,我不能使用
@Inject
lateinit var client : OkHttpClient
即使我在RetrofitModule上具有此提供方法也可以
@Provides
@Singleton
fun provideOkHttpClient(
httpLoggingInterceptor: HttpLoggingInterceptor,
headersInterceptor: HeadersInterceptor,
errorInterceptor: ErrorInterceptor
): OkHttpClient = OkHttpClient()
.newBuilder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(headersInterceptor)
.addInterceptor(errorInterceptor)
.build()
错误是
kotlin.UninitializedPropertyAccessException: lateinit property client has not been initialized
我想念的是什么?
对此有一个答案,但我无法复制此How do you override a module/dependency in a unit test with Dagger 2.0?
我假设您有一个扩展了SomeClass
的类AbstractBaseTest
,并且SomeClass
调用DaggerXComponent.create().inject(this)
注入其依赖项。不幸的是,这样就不会注入AbstractBaseTest
中声明的依赖项。
您应该像这样在AbstractBaseTest
中创建一个函数:
fun injectDependencies() = DaggerXComponent.create().inject(this)
并且具有SomeClass
的构造函数和所有扩展AbstractBaseTest
的其他类来调用该方法。
在github上有关于此的讨论,请检查此answer。