簡體   English   中英

如何使用 FragmentScenario 測試 DaggerFragment?

[英]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構建風味

  1. 創建兩種產品口味, mockprod

app/build.gradle

android {
    ...
    productFlavors {
        prod
        mock {
            applicationIdSuffix '.mock'
        }
    }
}
  1. 然后根據風味設置類型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
  1. 最后在片段中使用BaseFragment別名:
class SomeFragment : BaseFragment() {
   ...
}
  1. 要使用FragmentScenario測試代碼,請從prod*構建變體切換到mock*變體,並設置所有應該注入測試類中某處的依賴項(例如使用mock*

自己的DaggerFragment和測試片段的變體

  1. 創建您自己的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)
}
  1. 擴展您的DaggerFragment實現並將片段設置為open
open class SomeFragment : DaggerFragment() {
    ...
}
  1. 為測試目的創建另一個片段實現並覆蓋injectMembers方法:
class TestSomeFragment : SomeFragment() {

    override injectMembers() {
        /* you can manually inject dependencies and mocks here */
    }
}
  1. 在您的測試中使用TestSomeFragment

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM