【问题标题】:Dynamically add test modules in appComponent dagger 2?在 appComponent dagger 2 中动态添加测试模块?
【发布时间】:2018-05-29 09:04:46
【问题描述】:

您好,是否可以在我的 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 中,但它并没有为我提供动态添加不同 testModules 的太多灵活性。

@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 代码中我必须手动设置模块。

还有其他方法吗?

【问题讨论】:

    标签: android unit-testing automated-tests android-espresso dagger-2


    【解决方案1】:

    您应该向组件构建器添加一个函数并使用“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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多