android - 库项目中的 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?
解决方案
许多选项之一是
- 在您的 gradle 配置中创建 2 种风格:真实和模拟
- 在这两种风格中,定义一个布尔 buildConfigField 标志
- 在您的provideResourceProvider 中,根据标志的值返回相应的实现
推荐阅读
- java - java 中的 try 或 catch 中的 return 是如何工作的?
- reactjs - 所以... Redux 动作分派是同步还是异步?(没有 thunk 或 saga)
- angular - Angular:找不到“object”类型的不同支持对象“[object Object]”。NgFor 仅支持绑定到 Iterables,例如 Arrays
- android - cherche le ode API de la langue Tamazigh dans Google 翻译
- elasticsearch - Elasticsearch 数组和查询评分中的重复值
- javascript - 如何将对象数组的所有属性设置为 true?
- javascript - 固定侧边栏滚动和停止在页脚
- primefaces - 手风琴面板的背景图像
- javascript - 如何在同一个项目的另一个js文件中使用来自js文件的对象的属性?
- python-3.x - 在数组中检查 Python 3 中的标准输入时遇到问题