Dagger2 + ActivityInjection + AndroidXTest/Espresso/RoboElectric в проекте библиотеки

Я работаю над модулем библиотеки Android и хочу протестировать автономную активность в своем модуле. Я следил за статьей https://medium.com/androiddevelopers/write-once-run-everywhere-tests-on-android-88adb2ba20c5 для использования теста roboelectric и androidx с эспрессо. Недавно я представил dagger 2 в своем библиотечном проекте.

При этом моя активность выглядит так:

class XYZLibBaseActivity : AppCompatActivity(){

    @Inject
    lateinit var resourceProvider: ResourceProvider

    override fun onCreate(savedInstanceState: Bundle?) {
        //creating the dagger component
        DaggerXYZLibComponent.factory().create(application).inject(this)

        super.onCreate(savedInstanceState)
    }
}

My component declaration is 

@Component(modules = [ResourceProviderModule::class])
interface XYZLibComponent{

    @Component.Factory
    interface Factory{
        fun create(@BindsInstance application: Application):XYZLibComponent
    }

    fun inject(xyzLibBaseActivity: XYZLibBaseActivity)
}

and dagger module is 

@Module
class ResourceProviderModule {

    @Provides
    fun provideResourceProvider(application: Application): ResourceProvider{
        return ResourceProviderImpl(application.applicationContext)
    }

}

Это прекрасно работает, и я не хочу, чтобы базовое приложение использовало кинжал 2.

Теперь я хочу проверить свою активность, не завися от базового приложения или класса приложения. Как я могу внедрить макет ResourceProvider в действие?


person nik    schedule 19.05.2020    source источник


Ответы (1)


Один из многих вариантов

  1. создайте 2 варианта в вашей конфигурации gradle: реальный и фиктивный
  2. в обоих вариантах определите логический флаг buildConfigField
  3. В вашем providerResourceProvider верните соответствующую реализацию на основе значения флага.
person Alex Timonin    schedule 19.05.2020
comment
Убьет ли это цель DI, если мне придется добавить if else в код моего приложения? - person nik; 21.05.2020
comment
Нет, совсем нет. if else относится к коду модуля di, поэтому технически ваш код приложения не знает, какую реализацию ResourceProvider он получает. - person Alex Timonin; 22.05.2020