Estoy corriendo en un extraño fallo de la prueba con Espresso. La siguiente es la prueba de un TextView en un Diálogo que se muestra. Me sale el siguiente 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)

Tan claramente, la vista se encuentra, y en sus detalles, puede ver el texto= el valor de la estoy esperando. Sin embargo dice no coincide. Se ejecuta con la siguiente prueba de la declaración de

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

He intentado hacerlo con la siguiente declaración como bien, pero tiene un NoMatchingViewException, incluso a través de la Vista se muestra en la vista de jerarquía de la excepción.

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

Cualquier ayuda sobre por qué no? Vale la pena destacar que yo soy capaz de withText() isDisplayed() en un hermano de campo en el cuadro de diálogo.

  • El built-in withText(int resourceId) que viene con el Expreso es el buggy. Esto solo funciona si el texto que se comprueba es un java.lang.La cadena, pero un montón de textos que se utilizan son otras subclases de CharSequence, como Editable o Spannable. Asegúrese de que el tipo de texto que se comapring con es en realidad la Cadena, y si no escribir su propio comparador de que coincide con la Cadena de contenido, sin mirar el tipo.
  • Perfecto! Me había puesto el texto en el TextView con Html.fromHtml(), el cual resultó en un Extendió objeto. Escribió una costumbre comparador de que sólo hizo un #toString() en el textView.getText() en la #matchesSafely() y funciona perfectamente. Si desea presentar esto como una respuesta, te lo marca como aceptados, gracias!
  • En mi caso, yo era coincidente en contra de todas las tapas de texto que estaba en la pantalla. La real cadena en minúsculas con allCaps conjunto de propiedades, por lo que tuve que coincida con minúsculas.
InformationsquelleAutor JCricket | 2014-10-01

1 Comentario

  1. 3

    Esta respuesta fue creado en base a @haffax del comentario anterior.

    /**
    * 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;
    }
    }
    };
    }
    • Esto es manejado correctamente en Espresso 2.2.2.

Dejar respuesta

Please enter your comment!
Please enter your name here