Dagger2未在测试中注入实例

问题描述 投票:0回答:1

我正在尝试从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?

android kotlin android-espresso dagger-2 dagger
1个回答
0
投票

我假设您有一个扩展了SomeClass的类AbstractBaseTest,并且SomeClass调用DaggerXComponent.create().inject(this)注入其依赖项。不幸的是,这样就不会注入AbstractBaseTest中声明的依赖项。

您应该像这样在AbstractBaseTest中创建一个函数:

fun injectDependencies() = DaggerXComponent.create().inject(this)

并且具有SomeClass的构造函数和所有扩展AbstractBaseTest的其他类来调用该方法。

在github上有关于此的讨论,请检查此answer

© www.soinside.com 2019 - 2024. All rights reserved.