我找到了两种解决问题的方法:
我认为第一种方法更干净,并建议使用它而不是后者,但我将描述它们,所以你可以做出自己的选择。
用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
在您的测试中使用。