首页 > 解决方案 > 库项目中的 Dagger2 + ActivityInjection + AndroidXTest/Espresso/RoboElectric

问题描述

我正在研究 android 库模块,我想在我的模块中测试独​​立活动。我正在关注文章https://medium.com/androiddevelopers/write-once-run-everywhere-tests-on-android-88adb2ba20c5使用 roboelectric 和 androidx 测试与 espresso。我最近在我的图书馆项目中引入了 dagger 2。

这样我的 Activity 看起来像这样:

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

}

这工作得很好,我不希望底层应用程序使用 dagger 2。

现在我想在不依赖底层应用程序或应用程序类的情况下测试我的活动。如何在活动中注入模拟 ResourceProvider?

标签: androidandroid-espressodagger-2robolectricandroidx-test

解决方案


许多选项之一是

  1. 在您的 gradle 配置中创建 2 种风格:真实和模拟
  2. 在这两种风格中,定义一个布尔 buildConfigField 标志
  3. 在您的provideResourceProvider 中,根据标志的值返回相应的实现

推荐阅读