我有一个简单的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>
的注入器
如何正确运行测试?有人可以帮我吗?
答案 0 :(得分:1)
我找到了解决问题的两种方法:
typealias
,DaggerFragment
and special test variants of your fragments 我认为第一种方法更清洁,建议您使用它而不是后者,但是我将对它们进行描述,以便您可以自己选择。
使用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
。