Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Espresso withText in TextView Doesn't match selected View

I'm running into a odd test failure with Espresso. The following is to test a TextView in a displayed Dialog. I get the following error:

   com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'with string from resource id: <2131099772>' doesn't match the selected view.
Expected: with string from resource id: <2131099772>[my_content] value: Test Content Available
Got: "TextView{id=2131296340, res-name=dialog_content, visibility=VISIBLE, width=620, height=38, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=Test Content Available, input-type=0, ime-target=false}"

at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:579)
at com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:69)
at com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:40)
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:159)
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction.check(ViewInteraction.java:133)
at com.myapp.testContentDetails(FPATest.java:109)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner.onStart(GoogleInstrumentationTestRunner.java:167)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
Caused by: junit.framework.AssertionFailedError: 'with string from resource id: <2131099772>' doesn't match the selected view.
Expected: with string from resource id: <2131099772>[my_content] value: Test Content Available
Got: "TextView{id=2131296340, res-name=dialog_content, visibility=VISIBLE, width=620, height=38, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=Test Content Available, input-type=0, ime-target=false}"

at com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.assertThat(ViewMatchers.java:789)
at com.google.android.apps.common.testing.ui.espresso.assertion.ViewAssertions$2.check(ViewAssertions.java:76)
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction$2.run(ViewInteraction.java:145)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5081)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

So clearly, the view is found, and in it's details, you can see text= the value I'm expecting. Yet it says doesn't match. It's run with the following test statement

onView(withId(R.id.dialog_content)).check(
                matches(withText(R.string.my_content)));

I tried doing it with the following statement as well, but got a NoMatchingViewException, even through the View shows in the view hierarchy of the exception.

onView(withText(R.string.my_content)).check(
                matches(isDisplayed()));

Any help on why this would fail? Its worth noting i'm able to withText() isDisplayed() on a sibling field in the dialog.

like image 432
JCricket Avatar asked Oct 01 '14 20:10

JCricket


People also ask

How do I get Textview espresso from text?

The basic idea is to use a method with an internal ViewAction that retrieves the text in its perform method. Anonymous classes can only access final fields, so we cannot just let it set a local variable of getText() , but instead an array of String is used to get the string out of the ViewAction .

What is espresso Kotlin?

Espresso is a user interface-testing framework for testing android application developed in Java / Kotlin language using Android SDK. Therefore, espresso's only requirement is to develop the application using Android SDK in either Java or Kotlin and it is advised to have the latest Android Studio.


1 Answers

This answer was created based on @haffax's comment above.

/**
 * Original source from Espresso library, modified to handle spanned fields
 * 
 * Returns a matcher that matches a descendant of {@link TextView} that is
 * displaying the string associated with the given resource id.
 * 
 * @param resourceId
 *            the string resource the text view is expected to hold.
 */
public static Matcher<View> withText(final int resourceId) {

    return new BoundedMatcher<View, TextView>(TextView.class) {
        private String resourceName = null;
        private String expectedText = null;

        @Override
        public void describeTo(Description description) {
            description.appendText("with string from resource id: ");
            description.appendValue(resourceId);
            if (null != this.resourceName) {
                description.appendText("[");
                description.appendText(this.resourceName);
                description.appendText("]");
            }
            if (null != this.expectedText) {
                description.appendText(" value: ");
                description.appendText(this.expectedText);
            }
        }

        @Override
        public boolean matchesSafely(TextView textView) {
            if (null == this.expectedText) {
                try {
                    this.expectedText = textView.getResources().getString(
                            resourceId);
                    this.resourceName = textView.getResources()
                            .getResourceEntryName(resourceId);
                } catch (Resources.NotFoundException ignored) {
                    /*
                     * view could be from a context unaware of the resource
                     * id.
                     */
                }
            }
            if (null != this.expectedText) {
                return this.expectedText.equals(textView.getText()
                        .toString());
            } else {
                return false;
            }
        }
    };
}
like image 71
JCricket Avatar answered Oct 10 '22 04:10

JCricket