TextView中的文本与Espresso不匹配选定的视图

我正在用Espresso进行一个奇怪的testing失败。 以下是在显示的对话框中testingTextView。 我得到以下错误:

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) 

很明显,这个视图被find了,在这个细节中,你可以看到text =我期望的值。 然而它说不符合。 它用以下testing语句运行

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

我也试着用下面的语句来做这件事,但是得到了一个N​​oMatchingViewException,即使通过视图层次结构中的View显示exception。

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

任何帮助,为什么这会失败? 值得注意的是,我可以在对话框中的兄弟字段上使用Text()isDisplayed()。

Solutions Collecting From Web of "TextView中的文本与Espresso不匹配选定的视图"

这个答案是根据上面的@ haffax的评论创build的。

 /** * 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; } } }; }