Issue
I got following error when i run my unit test code.
Caused by: java.lang.IllegalStateException: Hilt Fragments must be attached to an @AndroidEntryPoint Activity. Found: class androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity
at dagger.hilt.internal.Preconditions.checkState(Preconditions.java:83)
at dagger.hilt.android.internal.managers.FragmentComponentManager.createComponent(FragmentComponentManager.java:75)
at dagger.hilt.android.internal.managers.FragmentComponentManager.generatedComponent(FragmentComponentManager.java:63)
at com.zhixin.wedeep.homepage.ui.Hilt_HomePage.generatedComponent(Hilt_HomePage.java:70)
at com.zhixin.wedeep.homepage.ui.Hilt_HomePage.inject(Hilt_HomePage.java:89)
at com.zhixin.wedeep.homepage.ui.Hilt_HomePage.initializeComponentContext(Hilt_HomePage.java:53)
at com.zhixin.wedeep.homepage.ui.Hilt_HomePage.onAttach(Hilt_HomePage.java:45)
at androidx.fragment.app.Fragment.onAttach(Fragment.java:1602)
at com.zhixin.wedeep.homepage.ui.Hilt_HomePage.onAttach(Hilt_HomePage.java:35)
at com.zhixin.wedeep.homepage.ui.HomePage.onAttach(HomePage.kt:281)
This is my test code.
@HiltAndroidTest
@UninstallModules(HomePageDataModule::class)
@RunWith(AndroidJUnit4::class)
@LargeTest
class TestHomePageFragment {
private val c = Composition("cyrus", "background", "description", "downloadUrl", "1000", "url", "1", true, "100", 100, "100", "test", "title", "1", "100", "cover", ArrayList(), "ONCE", null)
@Inject
lateinit var cpd: CompositionDao
@get:Rule
var hiltRule = HiltAndroidRule(this)
@Before
fun init() {
hiltRule.inject()
Util.RETROFIT
Util.enqueueResponse("mainpage.json")
cpd.createComposition(c)
cpd.createBrowseRecord(BrowseRecord(c.id, System.currentTimeMillis()))
val s = launchFragment<HomePage>()
s.onFragment {
IdlingRegistry.getInstance().register(it.mIdleResource)
}
/* dataBindingIdlingResourceRul = DataBindingIdlingResourceRule(s)
dataBindingIdlingResourceRul.starting(null)*/
}
@Test
fun testDataInitial() {
onView(ViewMatchers.withId(R.id.recycler_view_preview_data))
.perform(RecyclerViewActions.scrollToPosition<RecyclerView.ViewHolder>(1))
}
@After
fun finish(){
}
}
Any idea for this question?
Solution
As stated on Hilt guide, "Testing" section:
Warning: Hilt does not currently support FragmentScenario because there is no way to specify an activity class, and Hilt requires a Hilt fragment to be contained in a Hilt activity. One workaround for this is to launch a Hilt activity and then attach your fragment.
The error is happening since hilt-managed fragment should be attached to a hilt-managed Activity as well, in short, both should be annotated with @AndroidEntryPoint
. Because FragmentScenario uses an EmptyFragmentActivity to hold the underlying fragment being tested, currently there's no way to integrate Hilt with FragmentScenario. An workaround is to launch an activity and then attach the fragment to it.
Answered By - Ramon Rabello
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.