如何使用 Dagger 2.11 注入模拟

How to inject mocks with Dagger 2.11

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

在使用 Android 注入之前,我曾经更改应用程序中的注入器 class 以便我可以注入模拟。像这样:

class EGOApplication : Application() {

    lateinit var injectorComponent: InjectorComponent


    override fun onCreate() {
        super.onCreate()

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

在我的测试中,我曾经像这样更改 injectorComponent:

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

然后我可以从 MockModule 中注入我的模拟。

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

嗯...现在我像这样注入我的依赖项:

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

所以我的方法不再有效了...如何从我的 MockModule 中创建 Dagger 注入器依赖项?

感谢任何帮助!

我找到了答案。

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

@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

}

但现在我在扩展默认应用程序(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)
}

效果很好!