Учебники

Платформа для эспрессо-тестирования — AdapterView

AdapterView — это особый вид представления, специально разработанный для отображения набора аналогичной информации, такой как список продуктов и пользовательские контакты, полученные из основного источника данных с использованием Adapter . Источником данных может быть простой список сложных записей в базе данных. Некоторые из представлений, полученных из AdapterView, это ListView , GridView и Spinner .

AdapterView визуализирует пользовательский интерфейс динамически в зависимости от объема данных, доступных в базовом источнике данных. Кроме того, AdapterView отображает только минимально необходимые данные, которые можно отобразить в доступной видимой области экрана. AdapterView делает это для экономии памяти и для того, чтобы пользовательский интерфейс выглядел гладким, даже если базовые данные велики.

После анализа природа архитектуры AdapterView делает опцию onView и сопоставления его представлений неактуальной, поскольку конкретный проверяемый вид может вообще не отображаться вообще. К счастью, espresso предоставляет метод onData ( ), который принимает сопоставления hamcrest (относящиеся к типу данных базовых данных) для сопоставления базовых данных и возвращает объект типа DataInteraction, соответствующий представлению сопоставленных данных. Пример кода выглядит следующим образом:

onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())

Здесь onData () сопоставляет запись «Apple», если она доступна в базовых данных (список массивов), и возвращает объект DataInteraction для взаимодействия с согласованным представлением (TextView, соответствующее записи «Apple»).

методы

DataInteraction предоставляет следующие методы для взаимодействия с представлением,

выполнить ()

Это принимает действия просмотра и запускает переданные действия просмотра.

onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())

проверять()

Это принимает утверждения представления и проверяет переданные утверждения представления.

onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
   .check(matches(withText("Apple")))

inAdapterView ()

Это принимает представления соответствия. Он выбирает конкретный AdapterView на основе переданных сопоставлений представления и возвращает объект DataInteraction для взаимодействия с сопоставленным AdapterView.

onData(allOf())
   .inAdapterView(withId(R.id.adapter_view))
   .atPosition(5)
   .perform(click())

atPosition ()

Это принимает аргумент типа integer и ссылается на позицию элемента в базовых данных. Он выбирает представление, соответствующее переданному позиционному значению данных, и возвращает объект DataInteraction для взаимодействия с сопоставленным представлением. Это будет полезно, если мы знаем правильный порядок основных данных.

onData(allOf())
   .inAdapterView(withId(R.id.adapter_view))
   .atPosition(5)
   .perform(click())

onChildView ()

Это принимает сопоставления представлений и сопоставляет представление внутри определенного дочернего представления. Например, мы можем взаимодействовать с определенными элементами, такими как кнопка « Купить» в списке продуктов на основе AdapterView .

onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
   .onChildView(withId(R.id.buy_button))
   .perform(click())

Написать образец заявки

Выполните шаги, показанные ниже, чтобы написать простое приложение на основе AdapterView и написать контрольный пример с помощью метода onData () .

  • Запустите Android-студию.

  • Создайте новый проект, как обсуждалось ранее, и назовите его MyFruitApp .

  • Перенесите приложение на платформу AndroidX, используя меню параметров RefactorMigrate to AndroidX .

  • Удалите дизайн по умолчанию в основной деятельности и добавьте ListView . Содержимое Activity_main.xml выглядит следующим образом:

Запустите Android-студию.

Создайте новый проект, как обсуждалось ранее, и назовите его MyFruitApp .

Перенесите приложение на платформу AndroidX, используя меню параметров RefactorMigrate to AndroidX .

Удалите дизайн по умолчанию в основной деятельности и добавьте ListView . Содержимое Activity_main.xml выглядит следующим образом:

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   xmlns:app = "http://schemas.android.com/apk/res-auto"
   xmlns:tools = "http://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:layout_height = "match_parent"
   tools:context = ".MainActivity">
   <ListView
      android:id = "@+id/listView"
      android:layout_width = "wrap_content"
      android:layout_height = "wrap_content" />
</RelativeLayout>
  • Добавьте новый ресурс макета item.xml, чтобы указать шаблон элемента представления списка. Содержимое item.xml выглядит следующим образом:

Добавьте новый ресурс макета item.xml, чтобы указать шаблон элемента представления списка. Содержимое item.xml выглядит следующим образом:

<?xml version = "1.0" encoding = "utf-8"?>
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
   android:id = "@+id/name"
   android:layout_width = "fill_parent"
   android:layout_height = "fill_parent"
   android:padding = "8dp"
/>
  • Теперь создайте адаптер с массивом фруктов в качестве базовых данных и установите его в виде списка. Это должно быть сделано в onCreate () MainActivity, как указано ниже,

Теперь создайте адаптер с массивом фруктов в качестве базовых данных и установите его в виде списка. Это должно быть сделано в onCreate () MainActivity, как указано ниже,

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   
   // Find fruit list view
   final ListView listView = (ListView) findViewById(R.id.listView);
   
   // Initialize fruit data
   String[] fruits = new String[]{
      "Apple", 
      "Banana", 
      "Cherry", 
      "Dates", 
      "Elderberry", 
      "Fig", 
      "Grapes", 
      "Grapefruit", 
      "Guava",
      "Jack fruit", 
      "Lemon",
      "Mango", 
      "Orange", 
      "Papaya", 
      "Pears", 
      "Peaches", 
      "Pineapple",
      "Plums", 
      "Raspberry",
      "Strawberry", 
      "Watermelon"
   };
   
   // Create array list of fruits
   final ArrayList<String> fruitList = new ArrayList<String>();
   for (int i = 0; i < fruits.length; ++i) {
      fruitList.add(fruits[i]);
   }
   
   // Create Array adapter
   final ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item, fruitList);
   
   // Set adapter in list view
   listView.setAdapter(adapter);
}
  • Теперь скомпилируйте код и запустите приложение. Снимок экрана приложения My Fruit выглядит следующим образом:

Теперь скомпилируйте код и запустите приложение. Снимок экрана приложения My Fruit выглядит следующим образом:

Скомпилируйте код

  • Теперь откройте файл ExampleInstrumentedTest.java и добавьте ActivityTestRule, как указано ниже,

Теперь откройте файл ExampleInstrumentedTest.java и добавьте ActivityTestRule, как указано ниже,

@Rule
public ActivityTestRule<MainActivity> mActivityRule =
   new ActivityTestRule<MainActivity>(MainActivity.class);

Также убедитесь, что тестовая конфигурация выполнена в app / build.gradle

Добавьте новый контрольный пример для проверки представления списка, как показано ниже,

Наконец, запустите тестовый набор, используя контекстное меню Android Studio, и проверьте, все ли тестовые примеры выполнены успешно.