谁可以使用Roboletric测试片段中的dagger2注射

时间:2018-08-09 12:51:56

标签: android android-fragments dagger-2 robolectric androidinjector

我正在使用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

您有什么建议吗?

0 个答案:

没有答案