![](/img/trans.png)
[英]How to test interactions with menu when testing fragments with FragmentScenario
[英]How to test DaggerFragment with 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> 的注入器
如何正確運行測試? 有人可以幫我嗎?
我找到了兩種解決問題的方法:
typealias
使用單獨的構建風格,DaggerFragment
和您的片段的特殊測試變體我認為第一種方法更簡潔,並建議使用它而不是后者,但我將描述這兩種方法,因此您可以做出自己的選擇。
使用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*
變體,並設置所有應該注入測試類中某處的依賴項(例如使用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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.