Cómo inyectar simulacros con Dagger 2.11

Intento inyectar burlas con el Android Injector of Dagger 2.11.

Antes de usar Android Inject solía cambiar el inyector en la class Application para poder inyectar simulaciones. Me gusta esto:

class EGOApplication : Application() { lateinit var injectorComponent: InjectorComponent override fun onCreate() { super.onCreate() injectorComponent = DaggerInjectorComponent.builder() .appModule(AppModule(this)) .build() } 

Y en mis testings solía cambiar el componente inyector de esta manera:

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

Y luego puedo inyectar mis burlas de MockModule.

Pero ahora estoy usando Android Injector desde este tutorial: https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe

Bueno … ahora inyecté mis dependencies así:

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

Entonces mi enfoque ya no funciona … ¿Cómo puedo hacer las dependencies de Dagger Injector desde mi MockModule?

¡Cualquier ayuda es apreciada!

Encontré una respuesta.

Estaba cambiando el injectorComponent en mis testings … De esta manera:

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

Mi aplicación fue, más o less, así:

 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 } 

Pero ahora estoy usando una aplicación diferente para mis testings donde extiendo la aplicación pnetworkingeterminada (una aplicación de testing). En esta aplicación, construyo un inyector diferente:

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

Necesitarás crear un MockComponent que extienda el InjectorComponent y un MockModule que proporcione todos los simulacros que necesites.

Luego en tu testing solo hazlo:

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

¡Funciona bien!

  • Comprende cómo funcionan los comodines y los cartones reificados en Kotlin
  • ¿Para qué sirve emptyArray () en Kotlin?
  • Causado por: rx.exceptions.MissingBackpressureException
  • Kotlin setOnclickListener
  • Declarar un campo de interfaz estática en Kotlin
  • Cómo incrustar los loops en las templates de cadenas de Kotlin
  • Cómo modificar la variable de instancia de AsyncTask por separado
  • La compilation de Android falla con kotlin-reflect y proguard
  • La class Kotlin no obtiene su valor boolean de firebase
  • Tipo de devolución diferente en RxJava 2 (actualización desde RxJava1)
  • Cómo encontrar el nombre de la variable de string-array en strings.xml