如何将 MockModule 注入 DaggerAppComponent?

How to inject a MockModule into DaggerAppComponent?

我使用Dagger 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 注入我的模拟对象。

谁能给我指出正确的方向???

据我所知,我不确定我们是否可以一起模拟整个模块,但我们可以 模拟 module[=41] 提供的依赖项 =]. 我已经实现了这一点,我需要模拟 DataModule 进行 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 测试运行程序和浓缩咖啡来测试 UI,所以我按原样使用了 UI 模块和演示模块(无法模拟测试)。因此必须模拟不属于 UI 单元测试的其他依赖项,例如 DataRepository

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

最后,像这样在TestApplication中创建DaggerTestApplicationComponent

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 将生成所需的依赖关系图。

注意: 需要对模拟依赖项上调用的所有方法进行存根