如何用Dagger 2.11注入嘲笑

时间:2017-08-04 22:49:51

标签: android dependency-injection kotlin dagger-2 dagger

我正在尝试使用Dagger 2.11的Android Injector注入模拟。

在使用Android Inject之前,我曾经在Application类中更改了注入器,因此我可以注入模拟。像这样:

class EGOApplication : Application() {

    lateinit var injectorComponent: InjectorComponent


    override fun onCreate() {
        super.onCreate()

        injectorComponent = DaggerInjectorComponent.builder()
                .appModule(AppModule(this))               
                .build()
}

在我的测试中,我曾经像这样更改了喷射器组件:

app.injectorComponent = DaggerMockComponent.builder()
                .mockModule(MockModule(app))
                .build()

然后我可以从MockModule注入我的嘲笑。

但是现在我在本教程中使用Android Injector:https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe

嗯......现在我注入了我的依赖项:

override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
}

所以我的方法不再适用...... 如何从我的MockModule中制作Dagger注入器依赖项?

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我找到了答案。

我在测试中更改了injectComponent ......就像这样:

@Inject
lateinit var someDependency: SomeDependency

val app = instrumentation.targetContext.applicationContext as MyApplication

app.injectorComponent = DaggerMockComponent.builder()
                .mockModule(MockModule(app))
                .build()

if (null == mockComponent) {
      mockComponent = app.injectorComponent as MockComponent
      mockComponent!!.inject(this)
}

我的申请或多或少都是这样的:

open class MyApplication : Application(), HasActivityInjector {
        @Inject
        lateinit var androidInjector : DispatchingAndroidInjector<Activity>

    lateinit var injectorComponent: InjectorComponent

    override fun onCreate() {
        super.onCreate()              

        buildInjector()

    }


    open fun buildInjector() {
        injectorComponent = DaggerInjectorComponent.builder()
                .dataModule(DataModule())
                .appModule(AppModule(this))
                .trackerModule(TrackerModule(this, FirebaseAnalytics.getInstance(this)))
                .build()
    }

    override fun activityInjector(): AndroidInjector<Activity> = androidInjector

}

但是现在我在我的测试中使用了不同的Application,我扩展了默认的Application(TestApplication)。在这个应用程序中,我构建了一个不同的注入器:

class TestApplication : MyApplication() {

    override fun buildInjector() {
        injectorComponent = DaggerMockComponent.builder().mockModule(MockModule(this)).build()
    }
}

您需要创建一个扩展InjectorComponent的MockComponent和一个提供您需要的所有模拟的MockModule。

然后在你的测试中做:

@Before
fun setUp() {
    val app = instrumentation.targetContext.applicationContext as TestApplication
    (app.injectorComponent as MockComponent).inject(this)
}

它工作得很好!