I am trying to test using Espresso if my TextInputLayout
views have specific hint. I'd used a code as below:
Espresso.onView(ViewMatchers.withId(R.id.edit_text_email))
.check(ViewAssertions.matches(
ViewMatchers.withHint(R.string.edit_text_email_hint)))
This works fine for the normal EditText
views, not wrapped in TextInputLayout
. However when it wraps around, it no longer works.
I tried to use solution from Android Espresso - How to check EditText hint?, but it still does not working.
I also looked into: https://code.google.com/p/android/issues/detail?id=191261 that reported the issue, it says the workaround is quite easy by pointing to the current withHint
code, but I can't get it to work.
Any ideas to fix this issue?
Here's my custom matcher:
public static Matcher<View> hasTextInputLayoutHintText(final String expectedErrorText) {
return new TypeSafeMatcher<View>() {
@Override
public boolean matchesSafely(View view) {
if (!(view instanceof TextInputLayout)) {
return false;
}
CharSequence error = ((TextInputLayout) view).getHint();
if (error == null) {
return false;
}
String hint = error.toString();
return expectedErrorText.equals(hint);
}
@Override
public void describeTo(Description description) {
}
};
}
}
and here's how to use:
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
@Rule
public ActivityTestRule<MainActivity> mRule = new ActivityTestRule<>(MainActivity.class);
@Test
public void testMyApp() {
onView(withId(R.id.textInputLayout)).check
(matches(hasTextInputLayoutErrorText(mRule.getActivity().getString(R.string
.app_name))));
}
If you would like to check errorText
of TextInputLayout
, change this line:
CharSequence error = ((TextInputLayout) view).getHint();
with
CharSequence error = ((TextInputLayout) view).getError();
Hope it will help