我找到了两种解决问题的方法:
我认为第一种方法更干净,并建议使用它而不是后者,但我将描述它们,所以你可以做出自己的选择。
用typealias
- 创建两种产品风味,
mock以及prod:
app/build.gradle
android {
...
productFlavors {
prod
mock {
applicationIdSuffix '.mock'
}
}
}
- 然后
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
- 最后
BaseFragment在您的片段中使用别名:
class SomeFragment : BaseFragment() {
...
}
FragmentScenario使用从prod*构建变体切换到一个变体来测试代码mock*并设置所有应该在测试类中某处注入的依赖项(例如使用模拟)
拥有DaggerFragment和测试片段的变体
- 创建自己的
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)
}
- 扩展您的
DaggerFragment实现并设置片段open:
open class SomeFragment : DaggerFragment() {
...
}
- 为测试目的创建片段的另一个实现并覆盖该
injectMembers方法:
class TestSomeFragment : SomeFragment() {
override injectMembers() {
/* you can manually inject dependencies and mocks here */
}
}
TestSomeFragment在您的测试中使用。