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

它工作得很好!

相關問題