我找到了两种解决问题的方法:
我认为第一种方法更简洁,建议使用它而不是后者,但我将对它们进行描述,以便您做出自己的选择。
使用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。