はじめに
AndroidX TestでJVM上でEspressoのテストが実行可能になり、さらにfragment-testing
を使えば以下のように簡単にFragment単体でのUIテストを実行できます。
@Test
fun test() {
launchFragmentInContainer<FooFragment>()
...
onView(...).check(...)
}
しかし、Dagger2を使った既存のアプリで fragment-testing
を試してみたところ、以下のようなエラーが発生しました。
java.lang.IllegalArgumentException: No injector was found for FooFragment
Injectorが見つからないとのこと。。。
原因
launchFragmentInContainer()
の内部実装を見てみるとテスト用の空Activityである EmptyFragmentActivity
にテスト対象のFragmentをattachしていることがわかります。
そしてEmptyFragmentActivity
は単純なFragmentActivityを継承したクラスで、Dagger2のHasSupportFragmentInjector
は実装していません。
私の試した環境ではHasSupportFragmentInjector
未実装ActivityにattachされたFragmentのFragment#onAttach()
内で AndroidSupportInjection#inject(fragment)
を呼び出してしまったことが原因で上記エラーが発生してしまいました。
対処法
launchFragmentInContainer()
では起動するActivityを任意のものに差し替えることは(今のところ)できません。
https://issuetracker.google.com/issues/121347222
ではどうするか。。。
ApplicationクラスでHasSupportFragmentInjector
を実装しましょう!
Applicationクラスで実装しておけばActivityクラスでHasSupportFragmentInjector
を実装する必要はありません。
class TestApp: DaggerApplication(), HasSupportFragmentInjector {
@Inject
lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment>
override fun supportFragmentInjector(): DispatchingAndroidInjector<Fragment> =
supportFragmentInjector
...
}
これでlaunchFragmentInContainer()
でFragmentを起動可能になり、無事にテスト実行可能になります
サンプルコード