Эспрессо-тестирование элементов ListView щелчком по действию childView (расширяет FrameLayout) - PullRequest
0 голосов
/ 31 августа 2018

У меня есть действие, и внутри него у меня несколько дочерних просмотров:

public class CategoriesActivity extends AppCompatActivity {

    private StaggeredGridLayoutManager categoryGridLayoutManager;
    private DrawerLayout mDrawerLayout;
    private RecyclerView recyclerView;
    private NavigationView navigationView;
    private List<Category> categoryList;
    private Toolbar toolbar;
    private MaterialSearchView searchView;
    ...
 }

У меня есть панель инструментов, а на этой панели инструментов кнопка меню и кнопка поиска.

Главный экран выглядит так:

[первый экран] (https://imgur.com/bk0GXyOm.png)

Когда нажата кнопка поиска, вид поиска открывается поверх существующего списка и выглядит следующим образом:

[экран поиска] (https://imgur.com/XefVGFwm.png)

Мне интересно проверить функциональность поиска, точнее, проверить с помощью Espresso действие по нажатию на каждую из строк представления поиска (например, нажмите «Привет», затем нажмите «Добрый день») , так далее).

То, что у меня есть до сих пор, таково (получение количества предложений работает):

@RunWith(AndroidJUnit4.class)
public class CategoryActivityInstrumentedTests {
    @Rule
    public ActivityTestRule<CategoriesActivity> activityActivityTestRule = new ActivityTestRule<CategoriesActivity>(CategoriesActivity.class);

    @Before
    public void init(){
        //activityActivityTestRule.getActivity().getSupportFragmentManager().beginTransaction();
        Utils.level = 2;
    }

    @Test
    public void TestSuggestions(){
        onView(withId(R.id.action_search)).perform(click());
        onView(withId(R.id.search_view)).perform(new MyCustomViewAction());
    }

    public class MyCustomViewAction implements ViewAction {
        int size = 0;
        @Override
        public Matcher<View> getConstraints(){
            return isAssignableFrom(MaterialSearchView.class);
        }


        @Override
        public String getDescription(){
            return "whatever, size = " + size;
        }

        @Override
        public void perform(UiController uiController, View view){
            MaterialSearchView yourCustomView = (MaterialSearchView) view;
            size = yourCustomView.getSuggestionsCount();
            System.out.println(size);
            yourCustomView.mSuggestionsListView.performItemClick(yourCustomView.mSuggestionsListView.getAdapter().getView(1, null, null), 1, yourCustomView.mSuggestionsListView.getAdapter().getItemId(1));
                    //getItemAtPosition(0) toString(); // .performClick();
            Log.e(Constants.TAG_CategoriesActivity, " size = " + size);

        }

    }
}

Проблема в том, что я не могу получить этот список (представление поиска содержит список предложений) в этом действии, и поэтому я не могу выполнить действие щелчка по элементам этого представления.

Когда я выполняю щелчок внутри MyCustomViewAction, он работает, но я получаю исключение нулевого указателя в моей основной деятельности, потому что viewGroup не инициализирован.

Это код моего поиска:

public class MaterialSearchView extends FrameLayout implements Filter.FilterListener {

    //Views
    private View mSearchLayout;
    private View mTintView;
    public ListView mSuggestionsListView;
    private EditText mSearchSrcTextView;
    private ImageButton mBackBtn;
    private ImageButton mVoiceBtn;
    private ImageButton mEmptyBtn;
    private RelativeLayout mSearchTopBar;
    ...
}

Есть идеи? Спасибо!


EDIT

Я попробовал следующие вызовы в моем тестовом методе TestSuggestions ():

onData(allOf(withText("Bonjour"))) // Find the row in the list .inAdapterView(withId(R.id.search_view)) // Find the list in the view hierarchy .perform(click());

Я получил следующее исключение:

`I/TestRunner: android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id: com...:id/search_view'.`

1 Ответ

0 голосов
/ 01 сентября 2018

Я наконец нашел решения (есть как минимум 2 решения):

Первое решение:

    @Test
    public void TestSuggestions1(){
        for (int i=0 ; i<4081; i++) {

            onView(withId(R.id.action_search)).perform(click());    // opens the search
            Espresso.pressBack();   // performs the go back action to dismiss the keyboard
            onData(anything())      // selects the actual item at the desired position (which opens another activity)
                    .atPosition(i)
                    .perform(click());
            Espresso.pressBack();   // performs the go back action from the newer activity
            Log.e("TestSuggestions", " i = " + i);
        }
    }

Я иду до 4081, потому что это количество предложений, которые у меня есть.

Второе решение:

    @Test
    public void TestSuggestions2() {
        for (i = 0; i < 4081; i++) {
            onView(withId(R.id.action_search)).perform(click());    // opens the search
            try {
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Espresso.pressBack();   // performs the go back action from the newer activity
            onView(withId(R.id.search_view)).perform(new MyCustomViewAction()); // selects the actual item at the desired position (which opens another activity)
            try {
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Espresso.pressBack();
        }
    }

со следующим MyCustomViewAction:

    public class MyCustomViewAction implements ViewAction {
        int size = 0;

        @Override
        public Matcher<View> getConstraints(){
            return isAssignableFrom(MaterialSearchView.class);
        }

        @Override
        public String getDescription(){
            return "whatever, size = " + size;
        }

        @Override
        public void perform(UiController uiController, View view){
            MaterialSearchView yourCustomView = (MaterialSearchView) view;
            size = yourCustomView.getSuggestionsCount();
            yourCustomView.mSuggestionsListView.performItemClick(yourCustomView.mSuggestionsListView.getAdapter().getView(i, null, null), i, yourCustomView.mSuggestionsListView.getAdapter().getItemId(i));
            Log.e(Constants.TAG_CategoriesActivity, " size = " + size);
        }
    }

где i - это глобальная переменная в моем TestClass, которая начинается с 0.

...