12

运行单元测试代码时出现以下错误。

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(){

    }

}

对这个问题有任何想法吗?

4

3 回答 3

10

Hilt guide中所述,“测试”部分:

警告: Hilt 当前不支持 FragmentScenario,因为无法指定活动类,并且 Hilt 需要在 Hilt 活动中包含 Hilt 片段。一种解决方法是启动 Hilt 活动,然后附加您的片段。

发生错误是因为柄部管理的片段也应该附加到柄部管理的 Activity 上,简而言之,两者都应该用@AndroidEntryPoint. 因为 FragmentScenario 使用 EmptyFragmentActivity 来保存正在测试的底层 Fragment,所以目前没有办法将 Hilt 与 FragmentScenario 集成。一种解决方法是启动一个活动,然后将片段附加到它。

于 2020-08-04T03:41:01.047 回答
6

为了您的测试目的,如果您想测试片段检测测试,您可以执行以下步骤:

  1. 在您的调试源集中为 Activity Container 创建新的 Activity(或者如果您没有调试文件夹/源集,只需在主包中创建它)您可以在此处查看代码并在 Android 清单中注册该活动。

  2. 最后在你的 androidTest 包中创建这个内联函数。

您可以直接复制粘贴我提到的代码。它对我来说效果很好。这些代码由 Manuel Vivo 提供。

于 2020-10-31T09:31:16.237 回答
0

解决方案在于这个 Github 项目 -> https://github.com/android/architecture-samples/blob/dev-hilt/app/src/androidTest/java/com/example/android/architecture/blueprints/todoapp/HiltExt .kt

于 2021-03-21T22:29:27.323 回答