Есть ли возможность модульного тестирования MaterialSearchBar на Android Studio? - PullRequest
1 голос
/ 22 апреля 2020

Я проводил модульное тестирование своего кода и изо всех сил пытался найти способ модульного тестирования MaterialSearchBar на Android Studio из пакета implementation 'com.github.mancj:MaterialSearchBar:+'.

Я попытался выполнить юнит-тестирование, набрав

@Test
public void searchForTony() {
    onView(withId(R.id.search_bar)).perform(click()).perform(typeText("Tony"));
}

Но, похоже, это не работает, это похоже на способ, которым я тестировал мои поля EditText, могу ли я получить некоторые руководство как к этому подойти?

Спасибо

1 Ответ

0 голосов
/ 22 апреля 2020

MaterialSearchBar - это ViewGroup, а не EditText, поэтому вы не сможете использовать perform(typeText("Tony")) напрямую. Но вы знаете, что он содержит ровно один EditText.

Вы можете найти EditText с помощью другого ViewMatcher на EditText:

@Test
public void findEditTextByClassName(){

    onView(withClassName(containsString(EditText.class.getSimpleName()))).perform(replaceText("Tony"));
    onView(withText("Tony")).check(matches(isDisplayed()));
}

Кроме того, вы можете искать в дереве View, начиная с MaterialSearchBar как root, так как вы знаете, под каким идентификатором он присутствует в вашем макете:

@Test
public void findEditTextInViewTree(){
    // NOTE exchange R.id.material_search_bar for your own id value! 
    ViewGroup viewGroup = activityRule.getActivity().findViewById(R.id.material_search_bar);
    int id = -1;
    for(int i = 0; i < viewGroup.getChildCount(); i++){
        View view = viewGroup.getChildAt(i);
        if(view instanceof EditText){
            id = view.getId();
        }
    }
    onView(allOf(withParent(withId(R.id.material_search_bar)),withId(id))).perform(replaceText("Tony"));
    onView(withText("Tony")).check(matches(isDisplayed()));
}

Обратите внимание, что я использую replaceText() вместо typeText(), так как этот пост о поиске View, не о ожидании typeText() до финиша sh

...