代码之家  ›  专栏  ›  技术社区  ›  Chiara

如何将mockmodule注入到daggerAppComponent中?

  •  0
  • Chiara  · 技术社区  · 7 年前

    我已经使用了一段时间的匕首Android,现在我想注入一个mockmodule用于测试,我不知道如何获得它。我在一些帖子上看到他们称之为:

    DaggerAppComponent.builder()
      .dataModule(myMockModule)
      .create(this).inject(this)
    

    但我有这样的配置:

    @Singleton
    @Component(modules = [
        AndroidSupportInjectionModule::class,
        ActivitiesBuilderModule::class,
        AppModule::class,
        DataModule::class
    ])
    internal interface AppComponent : AndroidInjector<CbvApplication> {
    
        @Component.Builder
        abstract class Builder : AndroidInjector.Builder<CbvApplication>()
    
    }
    

    当我创建应用程序时, DaggerAppComponent.Builder 不提供 setters 对于单个模块。这是很好的原因,在应用程序代码中,我不必担心它,但是在测试中,我想通过mockcomponents/modules注入我的mock对象。

    有人能指出我的正确方向吗????

    1 回复  |  直到 7 年前
        1
  •  0
  •   adityakamble49    7 年前

    据我所知,我不确定我们可以一起模拟整个模块,但我们可以 模拟依赖项 由提供 模块 . 我已经做到了,我需要嘲笑 数据模块 对于UI测试,因此我创建了 TestDataModule 并为依赖提供了模拟。

    import com.nhaarman.mockito_kotlin.mock
    import dagger.Module
    import dagger.Provides
    import javax.inject.Singleton
    
    @Module
    class TestDataModule {
    
        @Provides
        @Singleton
        fun providesDataRepository(): DataRepository {
            return mock()
        }
    }
    

    这是 TestApplicationModule

    @Module
    abstract class TestApplicationModule {
    
        @Binds
        abstract fun bindContext(application: Application): Context
    }
    

    和创建 TestApplicationComponent 它将采用所需的模块

    @Singleton
    @Component(modules = [
        (AndroidSupportInjectionModule::class),
        (TestApplicationModule::class),
        (UIModule::class),
        (PresentationModule::class),
        (TestDataModule::class)])
    interface TestApplicationComponent {
    
        // Here you can add additional direct mock 
        // classes to access them directly from component reference
        fun dataRepository(): DataRepository 
    
    
        @Component.Builder
        interface Builder {
            @BindsInstance
            fun application(application: Application): TestApplicationComponent.Builder
    
            fun build(): TestApplicationComponent
        }
    
        fun inject(app: TestAppplication)
    }
    

    我必须使用android junit test runner和espresso测试用户界面,所以我使用了ui module和presentation模块(不能像想要测试的那样模拟)。所以必须模拟其他依赖项,这些依赖项不是UI单元测试的一部分,比如 数据存储库

    您可以添加其他模块(如cachemodule和remotemodules)作为模拟,因为它们在UI单元测试中不起任何作用。

    最后 ,创建 DaggerTestApplicationComponent 在里面 TestApplication 这样地,

    class TestApplication : Application(), HasActivityInjector {
    
        @Inject lateinit var activityInjector: DispatchingAndroidInjector<Activity>
        private lateinit var appComponent: TestApplicationComponent
    
        override fun onCreate() {
            super.onCreate()
            appComponent = DaggerTestApplicationComponent.builder()
                    .application(this)
                    .build()
            appComponent.inject(this)
        }
    
        override fun activityInjector(): AndroidInjector<Activity> = activityInjector
    }
    

    所以现在,DaggerTestApplicationComponent将生成所需的依赖关系图。

    注释 :它需要终止对模拟依赖项调用的所有方法