1

我正在尝试使用Dagger 2.11的Android注入器注入Mock。如何使用Dagger注入Mock 2.11

在使用Android Inject之前,我用来更改Application类中的注入器,以便注入mock。就像这样:

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注入器依赖项?

任何帮助表示赞赏!

+0

嘿,我有同样的问题。你有没有办法做到这一点? – Benoit

+0

是的,我做到了。检查我的答案。 –

回答

1

我找到了答案。

我在测试改变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 

} 

但现在我使用的是不同的应用程序为我的测试扩展默认应用程序(测试应用程序)。在这个应用程序,我建立一个不同的喷油器:

class TestApplication : MyApplication() { 

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

您将需要创建一个扩展InjectorComponent并提供你需要的所有嘲笑一个MockModule一个MockComponent。

在您的测试

然后就去做:

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

它工作得很好!

相关问题