如何通过Espresso android.widget.TextView setError进行测试?

时间:2015-02-09 10:56:34

标签: android testing textview android-espresso

我有password.setError(getResources().getString(R.string.incorrect_data)); 如果我设置了无效密码 - 显示textView文本"无效数据!", 我需要用Espresso测试它,我写道:

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

但这是错的,我有:

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131493034>[incorrect_data] value: Invalid data!
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.widget.ListView{307b4f3a IFED.VC. ......ID -480,0-0,1022 #7f0a004c app:id/left_drawer}

如果我写:onView(withText("Invalid data!")).check(matches(isDisplayed()));

我有:

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: is "Invalid data!"
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.widget.ListView{307b4f3a IFED.VC. ......ID -480,0-0,1022 #7f0a004c app:id/left_drawer}

我使用Espresso 2:

import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static android.support.test.espresso.Espresso.onView;

请帮帮我。

4 个答案:

答案 0 :(得分:6)

帮助了我:

onView(withId(R.id.password)).check(matches(withError(
                getActivity().getString(R.string.incorrect_data))));

private static Matcher<View> withError(final String expected) {
        return new TypeSafeMatcher<View>() {

            @Override
            public boolean matchesSafely(View view) {
                if (!(view instanceof EditText)) {
                    return false;
                }
                EditText editText = (EditText) view;
                return editText.getError().toString().equals(expected);
            }

            @Override
            public void describeTo(Description description) {

            }
        };
    }

答案 1 :(得分:3)

我为Espresso 1.x编写了一个自定义匹配器,它将TextView的textColor与给定值进行比较。也许您可以将此解决方案用于Espresso 2.x的EditText.getError(...)

/**
 * Returns a matcher that matches {@link TextView}s based on text property value. Note: View's
 * text property is never null. If you setText(null) it will still be "". Do not use null
 * matcher.
 *
 * @param integerMatcher {@link Matcher} of {@link String} with text to match
 */
public static Matcher<View> withCurrentTextColor(final Matcher<Integer> integerMatcher) {
  checkNotNull(integerMatcher);
  return new BoundedMatcher<View, TextView>(TextView.class) {
     @Override
     public void describeTo(Description description) {
        description.appendText("with text color: ");
        integerMatcher.describeTo(description);
     }

     @Override
     public boolean matchesSafely(TextView textView) {
        return integerMatcher.matches(textView.getCurrentTextColor());
     }
  };
}

/**
 * Returns a matcher that matches {@link TextView} based on it's text property value. Note:
 * View's Sugar for withTextColor(is("string")).
 */
public static Matcher<View> withCurrentTextColor(int color) {
  return withCurrentTextColor(is(color));
}

然后在你的测试用例中:

onView(withId(R.id.text_warning_title)).check(matches(withCurrentTextColor(activity.getResources().getColor(R.color.black_light))));

答案 2 :(得分:0)

Espresso分三步完成 1:找到视图 2:对视图执行操作    将触发您要验证的结果的操作 3:检查视图是否完成了它的功能。   使用提供的一些断言验证操作或结果

onView(withId(R.id.password_text)).perform(action);
onView(withId(R.id.view_for_expected_outcome)).check(expected outcome)

浏览https://google.github.io/android-testing-support-library/docs/index.html以查看有关Espresso的更多信息。

答案 3 :(得分:0)

请稍等一下,但这是Paushchyk Julia的Java代码的Kotlin版本。

    onView(withId(R.id.usernameText)).check(matches(withError(mActivity!!.getString(R.string.error_invalid_email))))


private fun withError(expected: String): Matcher<View> {
          return object : TypeSafeMatcher<View>() {
              override fun describeTo(description: org.hamcrest.Description?) {
              }

              override fun matchesSafely(item: View?): Boolean {
                  return if (item !is EditText) {
                      false
                  } else item.error.toString() == expected
              }
          }
      }