В вашем коде:
onView(withId(R.id.passwordTextInputLayout))
.check(hasDescendant(withId(R.id.text_input_password_toggle))) // assume you forgot matches(...)
.check(matches(not(isDisplayed())));
Последняя проверка not(isDisplayed))
выполняется для TextInputLayout, а не для CheckableImageButton
, как вы ожидали. Чтобы исправить эту ошибку, просто измените код на:
onView(withId(R.id.passwordTextInputLayout))
.check(matches(allOf(hasDescendant(withId(R.id.text_input_password_toggle)), not(isDisplayed()))))
Так что он может выполнять проверку отображения на кнопке.
В качестве альтернативы, если вы хотите создать собственный сопоставитель для TextInputLayout
, вы можете попробовать:
public static Matcher<View> isPasswordVisibilityToggleEnabled() {
return new BoundedMatcher<View, TextInputLayout>(TextInputLayout.class) {
@Override public void describeTo(Description description) {
description.appendText("is password visibility toggle enabled");
}
@Override protected boolean matchesSafely(TextInputLayout view) {
return view.isPasswordVisibilityToggleEnabled();
}
};
}
Затем вы можете изменить свой тестовый код на:
onView(withId(R.id.passwordTextInputLayout))
.check(matches(not(isPasswordVisibilityToggleEnabled())))
Я думаю, что view.isPasswordVisibilityToggleEnabled()
достаточно для простого теста в этом случае, но вы можете настроить его так, как вам нравится.