我正在使用Clean Architecture中的一个确实有viewPager的项目进行开发,因此在我的第一个片段中,我需要注入Presenter来处理操作。 我的问题是如何在使用Robolectric的片段单元测试中模拟演示者?
这是我的片段
class MyFragment: Fragment(), MyFragmentContract.View{
@Inject
lateinit var presenter: MyFragmentContract.Presenter
@BindView(R.id.rc_product) lateinit var rcProduct: RecyclerView
@BindView(R.id.tv_title) lateinit var title: TextView
@BindView(R.id.tv_zone) lateinit var zone: TextView
override fun onAttach(context: Context?) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
val view = inflater.inflate(R.layout.my_fragment, container, false)
ButterKnife.bind(this, view)
return view
}
这是我的测试应用程序类
class TestApplication : MyApplication(), AndroidInjector<Activity>{
companion object {
fun getComponent(): TestApplicationComponent {
return appComponent as TestApplicationComponent
}
}
override fun onCreate() {
appComponent = DaggerTestApplicationComponent.create()
}
override fun onLowMemory() = Unit
override fun onTerminate() = Unit
override fun onConfigurationChanged(newConfig: Configuration?) = Unit
override fun activityInjector(): AndroidInjector<Activity> {
return this
}
override fun inject(instance: Activity) {
when (instance) {
is MainActivity -> instance.presenter = mock(MainContract.Presenter::class.java)
}
}
我在testApplication类中重写了fun inject(instance:Activity),以强制测试类使用presenter模拟而非真实实例。 但是我真的不知道如何覆盖片段的注入功能。
我尝试添加AndroidInjector,但似乎AndroidInjector不能同时支持这两个功能,并且出现错误“超类型出现两次”。
我看到了这个话题: https://proandroiddev.com/fragment-espresso-testing-with-daggers-android-injector-2bd70b6a842d 可以与Espresso配合使用,但要使其适应 Robooletric 。
您有什么建议吗?