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!

  • Sirve favicon.ico y otros files estáticos con VertX
  • Dolor de cabeza por inheritance genérica de Kotlin
  • ¿Cómo poner los files de res del proyecto en el contenedor en la misma carpeta?
  • ¿Por qué una reference no resuelta al intentar acceder a valores constantes?
  • ¿Cómo encadenar transformaciones en Android al usar datos en vivo?
  • Kotlin lambda con varios parameters
  • Tipo de parámetro Kotlin no coincide
  • Manejo de variables mutables en múltiples funciones en Android Kotlin
  • Inicie la actividad de superposition sin mostrar el rest de la aplicación
  • Anulación de getter de Kotlin + MongoDB
  • Error de ambigüedad de resolución de sobrecarga en kotlin