Hilt Fragments 必须附加到 @AndroidEntryPoint Activity。找到:class androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity
Hilt Fragments must be attached to an @AndroidEntryPoint Activity. Found: class androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity
我 运行 我的单元测试代码时出现以下错误。
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)
这是我的测试代码。
@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(){
}
}
对这个问题有什么想法吗?
如 Hilt guide 所述,“测试”部分:
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.
错误发生是因为 hilt-managed 片段也应该附加到 hilt-managed Activity,简而言之,两者都应该用 @AndroidEntryPoint
注释。由于 FragmentScenario 使用 EmptyFragmentActivity 来保存正在测试的底层片段,因此目前无法将 Hilt 与 FragmentScenario 集成。解决方法是启动 activity,然后将片段附加到它。
为了您的测试目的,如果您想测试片段检测测试,您可以执行以下步骤:
为调试源集中的 Activity 容器创建新的 Activity(或者如果您没有调试 folder/source 集,只需将其放入主包)你可以看到代码 here 并在 Android 清单中注册 activity。
最后在您的 androidTest 包中创建 this inline function。
您可以直接 copy-paste 我提到的代码。它对我很有效。这些代码由 Manuel Vivo 提供。
解决方案就在这个Github项目中 -> https://github.com/android/architecture-samples/blob/dev-hilt/app/src/androidTest/java/com/example/android/architecture/blueprints/todoapp/HiltExt.kt
我 运行 我的单元测试代码时出现以下错误。
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)
这是我的测试代码。
@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(){
}
}
对这个问题有什么想法吗?
如 Hilt guide 所述,“测试”部分:
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.
错误发生是因为 hilt-managed 片段也应该附加到 hilt-managed Activity,简而言之,两者都应该用 @AndroidEntryPoint
注释。由于 FragmentScenario 使用 EmptyFragmentActivity 来保存正在测试的底层片段,因此目前无法将 Hilt 与 FragmentScenario 集成。解决方法是启动 activity,然后将片段附加到它。
为了您的测试目的,如果您想测试片段检测测试,您可以执行以下步骤:
为调试源集中的 Activity 容器创建新的 Activity(或者如果您没有调试 folder/source 集,只需将其放入主包)你可以看到代码 here 并在 Android 清单中注册 activity。
最后在您的 androidTest 包中创建 this inline function。
您可以直接 copy-paste 我提到的代码。它对我很有效。这些代码由 Manuel Vivo 提供。
解决方案就在这个Github项目中 -> https://github.com/android/architecture-samples/blob/dev-hilt/app/src/androidTest/java/com/example/android/architecture/blueprints/todoapp/HiltExt.kt