📅  最后修改于: 2020-12-06 09:36:58             🧑  作者: Mango
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对象以与匹配的视图进行交互(与“ Apple”条目对应的TextView)。
DataInteraction提供以下与视图进行交互的方法,
这接受视图动作并触发传入的视图动作。
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())
这接受视图声明并检查传入的视图声明。
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.check(matches(withText("Apple")))
这接受视图匹配器。它根据传入的视图匹配器选择特定的AdapterView并返回DataInteraction对象以与匹配的AdapterView进行交互
onData(allOf())
.inAdapterView(withId(R.id.adapter_view))
.atPosition(5)
.perform(click())
这接受整数类型的参数,并引用项目在基础数据中的位置。它选择与传入的数据位置值相对应的视图,并返回DataInteraction对象以与匹配的视图进行交互。如果我们知道基础数据的正确顺序,它将很有用。
onData(allOf())
.inAdapterView(withId(R.id.adapter_view))
.atPosition(5)
.perform(click())
这接受视图匹配器,并匹配特定子视图内的视图。例如,我们可以与特定项目互动,例如基于AdapterView的产品列表中的“购买”按钮。
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.onChildView(withId(R.id.buy_button))
.perform(click())
请按照以下所示的步骤编写一个基于AdapterView的简单应用程序,并使用onData()方法编写一个测试用例。
启动Android Studio。
如前所述创建一个新项目,并将其命名为MyFruitApp 。
使用重构→迁移到AndroidX选项菜单将应用程序迁移到AndroidX框架。
在主活动中删除默认设计,然后添加ListView 。 activity_main.xml的内容如下,
添加新的布局资源item.xml以指定列表视图的项目模板。 item.xml的内容如下,
现在,创建一个以水果数组作为基础数据的适配器,并将其设置为列表视图。这需要在MainActivity的onCreate()中完成,如下所示,
@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 fruitList = new ArrayList();
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 App的屏幕截图如下,
现在,打开ExampleInstrumentedTest.java文件并按以下指定添加ActivityTestRule ,
@Rule
public ActivityTestRule mActivityRule =
new ActivityTestRule(MainActivity.class);
另外,确保测试配置在app / build.gradle中完成–
dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test:rules:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
添加一个新的测试用例以测试列表视图,如下所示,
@Test
public void listView_isCorrect() {
// check list view is visible
onView(withId(R.id.listView)).check(matches(isDisplayed()));
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click());
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.check(matches(withText("Apple")));
// click a child item
onData(allOf())
.inAdapterView(withId(R.id.listView))
.atPosition(10)
.perform(click());
}
最后,使用android studio的上下文菜单运行测试用例,并检查是否所有测试用例都成功。