如何使用FragmentScenario测试DaggerFragment?

时间:2019-12-17 15:09:09

标签: android dagger-2 android-fragmentscenario

我有一个简单的Fragment,如下所示:

class SomeFragment : DaggerFragment() {
    ...
}

现在我想使用Fragment来测试FragmentScenario

class LoginFragmentTest {

    @Test
    fun test() {
        launchFragmentInContainer<SomeFragment>()
        onView(withId(R.id.someButton))
            .check(matches(isDisplayed()))
    }

}

但是每次我尝试始终进行测试时

  

java.lang.IllegalArgumentException:未找到<... SomeFragment>

的注入器

如何正确运行测试?有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的两种方法:

我认为第一种方法更清洁,建议您使用它而不是后者,但是我将对它们进行描述,以便您可以自己选择。


使用typealias

  1. 创建两个产品口味mockprod

app/build.gradle

android {
    ...
    productFlavors {
        prod
        mock {
            applicationIdSuffix '.mock'
        }
    }
}
  1. 然后根据口味设置typealias,我们将其称为BaseFragment

prod风味, app/src/prod/com.example.mypackage/BaseFragment.kt

typealias BaseFragment = DaggerFragment

mock风味,app/src/mock/com.example.mypackage/BaseFragment.kt

typealias BaseFragment = Fragment
  1. 最后在片段中使用BaseFragment别名:
class SomeFragment : BaseFragment() {
   ...
}
  1. 要使用FragmentScenario测试代码,请从prod*构建变体转换为mock*,并设置所有应该注入测试类中的依赖项(例如,使用模拟)

拥有DaggerFragment并测试片段的变体

  1. 创建您自己的DaggerFragment(基于实际的dagger.android.support.DaggerFragment实现)
abstract class DaggerFragment() : Fragment(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Object>

    override fun onAttach(context: Context) {
        injectMembers()
        super.onAttach(context)

    override fun androidInjector(): AndroidInjector<Object> = androidInjector

    protected open fun injectMembers() = AndroidSupportInjection.inject(this)
}
  1. 扩展您的DaggerFragment实现,并设置片段open
open class SomeFragment : DaggerFragment() {
    ...
}
  1. 为测试目的创建片段的另一种实现,并覆盖injectMembers方法:
class TestSomeFragment : SomeFragment() {

    override injectMembers() {
        /* you can manually inject dependencies and mocks here */
    }
}
  1. 在测试中使用TestSomeFragment