gpt4 book ai didi

android - 在 appComponent dagger 2 中动态添加测试模块?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:36 25 4
gpt4 key购买 nike

您好,可以在我的 AppComponent 中添加测试模块吗?

下面是我对 appComponent 的真实表示

@Singleton
@Component(modules = arrayOf(MainModule::class,
AnalyticsModule::class,
MainAndroidBinding::class,
AccountAndroidBinding::class,
AndroidSupportInjectionModule::class,
HomeAndroidBinding::class,
NetworkModule::class))
interface ApplicationComponent : AndroidInjector<DaggerApplication> {
fun inject(myApplication: MyApplication)
override fun inject(instance: DaggerApplication)

@Component.Builder
interface Builder {
@BindsInstance
fun application(applicaton: Application): Builder
fun build(): ApplicationComponent
}

}

我可以像这样直接将测试模块添加到 testAppComponent,但它并没有给我提供很大的灵 active 来动态添加不同的 testModule。

@Singleton
@Component(modules = [
(MainModuleTest::class),
(TestMainAndroidBindingTest::class),
(AccountAndroidBindingTest::class),
(AnalyticsModuleTest::class),
(AndroidSupportInjectionModule::class),
(NetworkModuleTest::class)])
interface TestAppComponent : ApplicationComponent {

fun inject(launchActivityTest: LaunchActivityTest)

@Component.Builder
interface Builder {
@BindsInstance
fun application(applicaton: Application): Builder

fun build(): TestAppComponent
}
}

这是我的 MyApplication 类

class MyApplication : DaggerApplication() {

companion object {

private lateinit var application: MyApplication

fun get(): MyApplication {
return application
}
}


@Inject
lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Activity>

lateinit var applicationComponent: ApplicationComponent

override fun onCreate() {
super.onCreate()
application = this
}

override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
applicationComponent = DaggerApplicationComponent.builder()
.application(this)
.build()
applicationComponent.inject(this)
return applicationComponent
}

override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
MultiDex.install(this)
}

}

在 LaunchActivityTest 上,这是我设置它以使用此 testApp 组件的方式

  @Before
fun setUp() {
val app = InstrumentationRegistry.getTargetContext().applicationContext as MyApplication
val testAppComponent = DaggerTestAppComponent.builder().application(app).build()
app.applicationComponent = testAppComponent
testAppComponent.inject(this)
}

我一直在遵循本指南,直到我偶然发现我的 DaggerTestAppComponent 没有公开模块供我动态添加自己,因为我的 AppComponent 类扩展了 AndroidInjector,它会自动为您添加模块

https://proandroiddev.com/writing-espresso-instrumentation-tests-with-dagger2-kotlin-d30f12c4769b

上面的动态添加它的模块是这样的:

testAppComponent = DaggerTestAppComponent.builder()
.appModule(AppModule(app))
.apiModule(TestApiModule())
.prefModule(TestPrefModule())
.build()

我不能这样做,除非我重做我的 AppComponent,这样它就不会扩展 AndroidInjector。如果我这样做,那么在我真正的 impl 代码中我必须手动设置模块。

还有其他办法吗?

最佳答案

您应该向您的组件构建器添加一个函数并使用“BindsInstance”。

示例组件

@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
ApplicationTestModule.class,
ActivityBuilder.class})
public interface TestExampleComponent extends AndroidInjector<DaggerApplication> {

void inject(TestApplication app);

@Override
void inject(DaggerApplication instance);

@Component.Builder
interface Builder {
@BindsInstance
TestExampleComponent.Builder application(DaggerApplication application);
Builder applicationModule(ApplicationTestModule appTestModule);
TestExampleComponent build();
}
}

在这个组件中,我使用“BindsInstance”添加了 applicationModule 函数,我可以传递 ApplicationTestModule。

然后你可以添加不同的测试模块。

TestApplicationComponent appComponent = DaggerTestAppComponent.builder().application(this).
applicationModule(appTestModule).build();
appComponent.inject(this);

关于android - 在 appComponent dagger 2 中动态添加测试模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com