Android Espresso测试用于在两个文本之间匹配文本内容

Android Espresso测试用于在两个文本之间匹配文本内容,android,unit-testing,android-espresso,Android,Unit Testing,Android Espresso,我已经创建了一个Android应用程序,它有登录编辑文本和密码编辑文本,条件是如果登录编辑文本和密码编辑文本中的两个内容都匹配,那么它的值为true或false。如何使用浓缩咖啡单元测试进行测试 我使用了下面的代码 @Test public void validLogin() { onView(withId(R.id.edtUserId)) .perform(typeText(mStringToBetyped), closeSoftKey

我已经创建了一个Android应用程序,它有登录编辑文本和密码编辑文本,条件是如果登录编辑文本和密码编辑文本中的两个内容都匹配,那么它的值为true或false。如何使用浓缩咖啡单元测试进行测试

我使用了下面的代码

 @Test
    public void validLogin() {
        onView(withId(R.id.edtUserId))
                .perform(typeText(mStringToBetyped), closeSoftKeyboard());
        onView(withId(R.id.edtPass))
                .perform(typeText(mValidPass), closeSoftKeyboard());
        onView(withId(R.id.loginBtn)).perform(click());

      //  onView(allOf(withId(R.id.edtUserId))).check(matches(withText(String.valueOf(allOf(withId(R.id.edtPass))))));

        onView(withId(R.id.edtUserId)).check(matches(isEditTextValueEqualTo(R.id.edtPass, mStringToBetyped)));

     /*   onView(allOf(withId(R.id.edtUserId)))
                .check(matches(withText(String.valueOf(withId(R.id.edtPass)))));*/


        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Matcher<View> isEditTextValueEqualTo(final int viewId, final String content) {

    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(Description description) {
            description.appendText("Match Edit Text Value with View ID Value : :  " + content);
        }

        @Override
        public boolean matchesSafely(View view) {
            if (view != null) {
                String editTextValue = ((EditText) view.findViewById(viewId)).getText().toString();

                if (editTextValue.equalsIgnoreCase(content)) {
                    return true;
                }
            }
            return false;
        }
    };
}

您的
isEditTextValueEqualTo
中的
视图实际上是
R.id.edtUserId
,因此
视图.findViewById(R.id.edtPass)
将返回空值。 试着换一下这个

onView(withId(R.id.your_parent_view_that_has_edtPass)).check(matches(isEditTextValueEqualTo(R.id.edtPass, mStringToBetyped)));
如果您真的想使用自定义的
匹配器
,那么这个怎么样

Matcher<View> isEditTextValueEqualTo(final int viewId1, final int viewId2, final String content) {

    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(Description description) {
            description.appendText("Match Edit Text Value with View ID Value : :  " + content);
        }

        @Override
        public boolean matchesSafely(View view) {
            if (view != null) {
                String editTextValue1 = ((EditText) view.findViewById(viewId1)).getText().toString();
                String editTextValue2 = ((EditText) view.findViewById(viewId2)).getText().toString();

                if (editTextValue1.equalsIgnoreCase(editTextValue2)) {
                    return true;
                }
            }
            return false;
        }
    };
}

您的
isEditTextValueEqualTo
中的
视图实际上是
R.id.edtUserId
,因此
视图.findViewById(R.id.edtPass)
将返回空值。 试着换一下这个

onView(withId(R.id.your_parent_view_that_has_edtPass)).check(matches(isEditTextValueEqualTo(R.id.edtPass, mStringToBetyped)));
如果您真的想使用自定义的
匹配器
,那么这个怎么样

Matcher<View> isEditTextValueEqualTo(final int viewId1, final int viewId2, final String content) {

    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(Description description) {
            description.appendText("Match Edit Text Value with View ID Value : :  " + content);
        }

        @Override
        public boolean matchesSafely(View view) {
            if (view != null) {
                String editTextValue1 = ((EditText) view.findViewById(viewId1)).getText().toString();
                String editTextValue2 = ((EditText) view.findViewById(viewId2)).getText().toString();

                if (editTextValue1.equalsIgnoreCase(editTextValue2)) {
                    return true;
                }
            }
            return false;
        }
    };
}

以下是一个不使用自定义匹配器的解决方案:

onView(withId(R.id.parentViewId)).check(matches(allOf(
            hasDescendant(allOf(withId(R.id.edtUserId), withText(mStringToBetyped))),
            hasDescendant(allOf(withId(R.id.edtPass), withText(mStringToBetyped)))
    )));
但是,由于您只比较两个视图中的文本,因此可以将Assert类用作:


以下是一个不使用自定义匹配器的解决方案:

onView(withId(R.id.parentViewId)).check(matches(allOf(
            hasDescendant(allOf(withId(R.id.edtUserId), withText(mStringToBetyped))),
            hasDescendant(allOf(withId(R.id.edtPass), withText(mStringToBetyped)))
    )));
但是,由于您只比较两个视图中的文本,因此可以将Assert类用作:


我需要检查edtUser中的文本与edtPass中的文本匹配,从代码中我看到您想要检查
R.id.edtPass
vs
mStringToBetyped
中的文本,但是如果您想要检查两个编辑文本中的文本,只需使用
Assert.equals(edittext1.getText().toString(),edittext2.getText().toString())
我刚意识到一件事。@Yatin你是说你的应用程序的功能是,如果用户名与密码匹配,用户可以成功登录(这就是你要测试的)?是@ADroid…正是我所需要的我需要检查edtUser内部的文本与edtPass内部的文本匹配奇怪,从您的代码中我看到您想要检查
R.id.edtPass
vs
mStringToBetyped
内部的文本,但是如果您想要检查两个编辑文本内部的文本,只需使用
Assert.equals(edittext1.getText().toString()),edittext2.getText().toString()
我刚刚意识到一件事。@Yatin你是说你的应用程序的功能是,如果用户名与密码匹配,用户可以成功登录(这就是你要测试的)?是的@ADroid…正是我需要的这也是一种方法:)这也是一种方法:)