代码之家  ›  专栏  ›  技术社区  ›  Leandro Borges Ferreira

如何使用匕首2.11注入模拟

  •  3
  • Leandro Borges Ferreira  · 技术社区  · 9 年前

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

    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注入我的mock。

    https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe

    嗯……现在我注入依赖项如下:

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

    所以我的方法不再有效了。。。 如何从MockModule中建立匕首注入器依赖关系?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Leandro Borges Ferreira    9 年前

    我找到了答案。

    我在测试中改变了注射剂成分……如下所示:

    @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()
        }
    }
    

    然后在测试中只需执行以下操作:

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