簡體   English   中英

Android Espresso測試,用於在兩個EditText之間匹配文本內容

[英]Android Espresso Testing for matching text content between two EditTexts

我創建了一個Android應用程序,該應用程序具有Login Edit Text和Password EditText,條件是如果Login EditText和Password EditText中的兩個內容都匹配,則其true否則為false。 如何使用Espresso單元測試進行測試

我用下面的代碼。

 @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;
        }
    };
}

但這給我Matcher錯誤,如下所示

java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at com.test.espressodemo.MainActivityTest$1.matchesSafely(MainActivityTest.java:90)
at com.test.espressodemo.MainActivityTest$1.matchesSafely(MainActivityTest.java:80)
at org.hamcrest.TypeSafeMatcher.matches(TypeSafeMatcher.java:65)
at android.support.test.espresso.matcher.ViewMatchers.assertThat(ViewMatchers.java:526)
at android.support.test.espresso.assertion.ViewAssertions$MatchesViewAssertion.check(ViewAssertions.java:103)
at android.support.test.espresso.ViewInteraction$SingleExecutionViewAssertion.check(ViewInteraction.java:415)
at android.support.test.espresso.ViewInteraction$2.call(ViewInteraction.java:279)
at android.support.test.espresso.ViewInteraction$2.call(ViewInteraction.java:265)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

isEditTextValueEqualTo內部的view實際上是R.id.edtUserId ,因此view.findViewById(R.id.edtPass)將返回null。 嘗試更改為此

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

如果您真的想使用自定義Matcher ,那么如何

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.your_parent_view_that_has_edtPass)).check(matches(isEditTextValueEqualTo(R.id.edtPass, R.id.edtUserId)));

這是不使用自定義匹配器的解決方案:

onView(withId(R.id.parentViewId)).check(matches(allOf(
            hasDescendant(allOf(withId(R.id.edtUserId), withText(mStringToBetyped))),
            hasDescendant(allOf(withId(R.id.edtPass), withText(mStringToBetyped)))
    )));

但是,由於您僅在2個視圖中比較文本,因此可以使用Bach Vu提到的Assert類:

Assert.equals(edittext1.getText().toString(), edittext2.getText().toString())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM