android-test: Toast message assertions not working with android 11 and target sdk 30

Description

On the app I am testing there are a number of toast messages that I check to make sure toasts are displayed with correct text. My espresso tests started to fail when using Android 11 and SDK30.

Steps to Reproduce

I have a simple check where I try to check the text appears on screen for a toast. onView(withText(R.string.toast_text)).inRoot( withDecorView(not(activityRule.activity.window.decorView))) .check(matches(isDisplayed()))

I have also tried with a Custom toast matcher without any luck

fun onToast(
        text: Int,
       @IntRange(from = 1) maximumRetries: Int = MAX_RETRIES
 ): ViewInteraction = onView(withText(text)).inRoot(ToastMatcher(maximumRetries))

class ToastMatcher(private val maximumRetries: Int) : TypeSafeMatcher<Root>() {

private var currentFailures: Int = 0

override fun describeTo(description: Description?) {
    description?.appendText("no toast found after")
}

override fun matchesSafely(item: Root?): Boolean {
    val type: Int? = item?.windowLayoutParams?.get()?.type

    if(TYPE_TOAST == type || TYPE_APPLICATION_OVERLAY == type) {
        val windowToken = item.decorView.windowToken
        val appToken = item.decorView.applicationWindowToken

        if(windowToken == appToken) {
            return true
        }
    }

    return ++currentFailures >= maximumRetries
}
}

onToast(R.string.toast_text) .check(matches(isDisplayed()))

Expected Results

Tests pass. This works as expected when using OS lower than android 11. It also works as expected when using android 11 and sdk 29. I also tried updating the version of androidx and espresso to the latest version 3.3.0 and 1.3.0 but this did not make any difference.

Actual Results

Result when using withDecorView androidx.test.espresso.NoMatchingRootException: Matcher 'with decor view not <DecorView@5ae48a6[TestActivity]>' did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@1337585, window-token=android.view.ViewRootImpl$W@1337585, has-window-focus=true, layout-params-type=1, layout-params-string={(0,0)(fillxfill) sim={state=hidden} ty=BASE_APPLICATION wanim=0x10302fe fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND FIT_INSETS_CONTROLLED fitSides=}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=1080, height=2160, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params={(0,0)(fillxfill) sim={state=hidden} ty=BASE_APPLICATION wanim=0x10302fe fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND FIT_INSETS_CONTROLLED fitSides=}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}}] at dalvik.system.VMStack.getThreadStackTrace(Native Method) at java.lang.Thread.getStackTrace(Thread.java:1736) at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:96) at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:59) at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:322) at androidx.test.espresso.ViewInteraction.check(ViewInteraction.java:306)

Result when using ToastMatcher androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131755255>[toast_text] value: Toast Text. If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:com.squareup.timessquare.CalendarPickerView{1af12d7 VFED.VC.. ........ 0,0-1080,1657 #7f09010e app:id/calendarPv} View Hierarchy: +>DecorView{id=-1, visibility=VISIBLE, width=1080, height=2160, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302fe fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND FIT_INSETS_CONTROLLED fitSides=}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3} |

AndroidX Test and Android OS Versions

AndroidX Test: 1.2.0 Espresso: 3.2.0 Android OS: Android 11 (API 30)

About this issue

  • Original URL
  • State: open
  • Created 4 years ago
  • Reactions: 59
  • Comments: 29 (1 by maintainers)

Commits related to this issue

Most upvoted comments

So, we are unable to test toasts now? Is there a reason for that? Security issues?

Hi @ralf-at-android

When I write the test to verify Toast is displayed like this:

Espresso.onView(withText(“Toast message here”)).inRoot(withDecorView(not(decorView))).check(matches(isDisplayed()))

It work fine in Android lower Android 11. But from Android 11 I have an exception like this:

androidx.test.espresso.NoMarchingRootException: Matcher ‘with decor view not <DecorView@17028cf[MyActivity]>’ did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@3daab3f, window-token=android.view.ViewRootImpl$W@3daab3f, has-window-focus=true, layout-params-type=1, layout-params-string={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302fe

Thank you for your idea about that!

Maybe, but you’re not having Toasts in all of your tests hopefully, right? 😅

Thanks a ton, @djbrown 😃 I was spending days with the Toast. Now SnackBar worked like a charm!

@clarabez It didn’t work for me in Android 12 , the assertion always Fails :\

@clarabez I cannot open your project. Its showing page not found. I assume that its in your android testing repository. Can you pls specify the package and the class to look at.

Ops, sorry, it was private. Now it is public. Link here.

@TWiStErRob Yes I have used Toast as less as possible because of the testing issue. But there are some cases that can only be verified using toast . I am stuck in that 😃