androidx.test.espresso.NoMatchingViewException:层次结构中未找到匹配的视图

androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching

我正在尝试用 Espresso 测试我的片段。无论我尝试测试什么视图,我都会得到 NoMatchingViewException,我 100% 确定该视图确实存在于片段中。 这是我的测试:

@LargeTest
@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
class ExploreFragmentTest {
    private lateinit var blogRepository: FakeBlogRepository
    private lateinit var inAppMessagesRepository: FakeInAppMessageRepository
    private lateinit var fakeFarRetailsRepository: FakeFarRetailsRepository
    private lateinit var fakeUserProfileRepository: FakeUserProfileRepository

    @Before
    fun initRepository() {
        blogRepository = FakeBlogRepository()
        inAppMessagesRepository = FakeInAppMessageRepository()
        fakeFarRetailsRepository = FakeFarRetailsRepository()
        fakeUserProfileRepository = FakeUserProfileRepository()

        ServiceLocator.blogRepository = blogRepository
        ServiceLocator.inAppMessagesRepository = inAppMessagesRepository
        ServiceLocator.userProfileRepository = fakeUserProfileRepository
    }

    @Test
    fun noRetailsNearby_displaysNoRetailsNearbyLayout() = runBlockingTest {
        // GIVEN - A fake repository with far retails
        ServiceLocator.retailsRepository = fakeFarRetailsRepository
        // WHEN - ExploreFragment launched to display retails
        launchFragmentInContainer<ExploreFragment>(null, R.style.AppTheme)
        // THEN - No retails layout is displayed on the screen
        onView(withId(R.id.clExploreContainer)).check(matches(isDisplayed()))
    }
}

这是相关片段的布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@id/clExploreContainer"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/ablExplore"
            android:layout_width="match_parent"
            android:layout_height="@dimen/toolbar_height"
            android:background="@android:color/transparent"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <com.google.android.material.appbar.CollapsingToolbarLayout
                android:id="@+id/ctlExploreHeader"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|exitUntilCollapsed"
                app:statusBarScrim="@android:color/transparent"
                app:toolbarId="@+id/tbExplore">

            <ImageView
                    android:id="@+id/ivHeaderLemon"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@color/colorPrimary"
                    android:scaleType="centerCrop"
                    android:src="@drawable/bg_main"
                    app:layout_collapseMode="parallax" />

            <androidx.appcompat.widget.Toolbar
                    android:id="@+id/tbExplore"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/collapsed_toolbar_height"
                    app:layout_collapseMode="pin"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

            <androidx.constraintlayout.widget.ConstraintLayout
                    android:id="@+id/collapsing_logo"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:layout_marginStart="20dp"
                    android:minHeight="?attr/actionBarSize">

                <ImageView
                        android:id="@+id/ivLogo"
                        android:layout_width="@dimen/toolbar_logo_width"
                        android:layout_height="@dimen/toolbar_logo_height"
                        android:adjustViewBounds="true"
                        android:scaleType="fitStart"
                        android:src="@drawable/myfoody_logo"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />
            </androidx.constraintlayout.widget.ConstraintLayout>

        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
            android:id="@+id/svExplore"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/clExploreContainer"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            <include
                    android:id="@+id/miniInAppMessageLayout"
                    layout="@layout/mini_in_app_message_layout"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:visibility="gone"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    tools:visibility="visible" />

            <include
                    android:id="@+id/tutorialLayout"
                    layout="@layout/tutorial_layout"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="20dp"
                    android:layout_marginTop="32dp"
                    android:layout_marginEnd="20dp"
                    android:visibility="gone"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@id/miniInAppMessageLayout"
                    tools:visibility="visible" />

            <include
                    android:id="@+id/nearToMeLayout"
                    layout="@layout/near_to_me_layout"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/tutorialLayout" />

            <include
                    android:id="@+id/favouritesLayout"
                    layout="@layout/favourites_layout"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/section_explore_margin_top"
                    android:visibility="gone"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/nearToMeLayout"
                    tools:visibility="visible" />

            <androidx.fragment.app.FragmentContainerView
                    android:id="@+id/flCompanyMessageFragment"
                    android:name="com.anagramma.myfoody.fragments.explore.blog.RecipesFragment"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/section_explore_margin_top"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/favouritesLayout" />

            <androidx.constraintlayout.widget.ConstraintLayout
                    android:id="@+id/clRemoteMessagesContainer"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@id/flCompanyMessageFragment">

                <include
                        android:id="@+id/rcmlExplore"
                        layout="@layout/remote_config_message_layout_explore"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:visibility="gone"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        tools:visibility="visible" />

                <include
                        android:id="@+id/lMeetMyBrandBannerExplore"
                        layout="@layout/meet_my_brand_banner"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/section_explore_margin_top"
                        android:visibility="gone"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />

            </androidx.constraintlayout.widget.ConstraintLayout>

            <androidx.fragment.app.FragmentContainerView
                    android:id="@+id/flLastArticles"
                    android:name="com.anagramma.myfoody.fragments.explore.blog.LastArticlesFragment"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/section_explore_margin_top"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/clRemoteMessagesContainer"
                    tools:layout="@layout/fragment_explore_blog_section" />

            <androidx.fragment.app.FragmentContainerView
                    android:id="@+id/flLiveSustainable"
                    android:name="com.anagramma.myfoody.fragments.explore.blog.LiveSustainableFragment"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/section_explore_margin_top"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/flLastArticles"
                    tools:layout="@layout/fragment_explore_blog_section" />

            <androidx.fragment.app.FragmentContainerView
                    android:id="@+id/flMyFoodyWorld"
                    android:name="com.anagramma.myfoody.fragments.explore.blog.MyFoodyWorldFragment"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/section_explore_margin_top"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/flLiveSustainable"
                    tools:layout="@layout/fragment_explore_blog_section" />

            <androidx.fragment.app.FragmentContainerView
                    android:id="@+id/fAutoProduction"
                    android:name="com.anagramma.myfoody.fragments.explore.blog.AutoproductionFragment"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/section_explore_margin_top"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/flMyFoodyWorld"
                    tools:layout="@layout/fragment_explore_blog_section" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

每次我 运行 测试都会得到这个错误:androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.anagramma.myfoody.staging:id/clExploreContainer,不明白为什么。我是否遗漏了与浓缩咖啡框架相关的内容?

我的问题是我的片段在启动期间有一个 DialogFragment 覆盖了整个原始片段视图。由于 DialogFragment 有另一个生命周期,我的 Espresso 测试没有在父片段上找到任何视图 (ExploreFragment)。删除后 DialogFragment 视图匹配在我的测试中表现良好。