1

J'essaie d'injecter des simulacres en utilisant l'injecteur Android de Dagger 2.11. Avant d'utiliser l'Injecteur Android, je changeais l'injecteur dans la classe Application pour que je puisse injecter des mock. Comme ceci:Comment injecter des simulacres avec Dagger 2.11

class EGOApplication : Application() { 

    lateinit var injectorComponent: InjectorComponent 


    override fun onCreate() { 
     super.onCreate() 

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

Et dans mes tests, j'utilisé pour changer le injectorComponent comme ceci:

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

Et puis je peux injecter mes simulacres de MockModule.

Mais maintenant, je suis en utilisant le formulaire de Injector Android ce tutoriel: https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe

... Eh bien maintenant, j'injectent mes dépendances comme ceci:

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

Alors mon approche ne fonctionne plus ... Comment est-ce que je peux faire des dépendances d'injecteur de Dagger de mon MockModule?

Toute aide est appréciée!

+0

Hey, j'ai la même question. Avez-vous trouvé un moyen de le faire? – Benoit

+0

oui, je l'ai fait. Vérifie ma réponse –

Répondre

1

J'ai trouvé une réponse.

Je changions la injectorComponent dans mes tests ... Comme ceci:

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

Ma demande était, plus ou moins, comme ceci:

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 

} 

Mais maintenant, je me sers d'un autre Application pour mes tests où j'étend l'application par défaut (une application de test). Dans cette application, je construis un injecteur différent:

class TestApplication : MyApplication() { 

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

Vous aurez besoin de créer un MockComponent qui étend la InjectorComponent et un MockModule qui fournit tous les simulacres que vous avez besoin.

Ensuite, dans votre test juste faire:

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

Il fonctionne très bien!