У меня есть действие, и внутри него у меня несколько дочерних просмотров:
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'.`