Android 如何使用测试数据测试ListActivity?
我正在为一个简单的Android应用程序编写测试(这是一个学校项目),而我在测试扩展Android的ListActivity的activity ContactListActivity时遇到了问题 我想测试什么 单击ContactListActivity的ListView中的第一项并检查ContactDetailActivity是否已启动 问题 列表数据来自SQLite数据库。对于测试,我正在将测试数据加载到ListView中,因此测试不会使用实时数据。加载测试数据工作正常。在运行测试时观察模拟器,我可以看到正在启动的活动以及列表中显示的测试数据。但是,尝试访问第一个(也是唯一一个)列表项失败 试验方法Android 如何使用测试数据测试ListActivity?,android,android-testing,Android,Android Testing,我正在为一个简单的Android应用程序编写测试(这是一个学校项目),而我在测试扩展Android的ListActivity的activity ContactListActivity时遇到了问题 我想测试什么 单击ContactListActivity的ListView中的第一项并检查ContactDetailActivity是否已启动 问题 列表数据来自SQLite数据库。对于测试,我正在将测试数据加载到ListView中,因此测试不会使用实时数据。加载测试数据工作正常。在运行测试时观察模拟器
@UiThreadTest
公共最终作废testLoadContactDetail(){
ListView list=activity.getListView();
assertNotNull(列表);
ContactsListAdapter适配器=新ContactsListAdapter(
getInstrumentation().getContext(),
createData()//创建测试数据的ArrayList
);
list.setAdapter(适配器);
adapter.notifyDataSetChanged();
//list.getAdapter().getCount()应为1
//list.getChildCount()意外为0
assertNotNull(list.getChildAt(0));//断言失败
// (...)
}
可以看出,我用@UIThreadTest
注释测试,以便能够操作视图元素。将使用测试数据创建一个新的ListAdapter,并将其设置为列表。然后,adapter.notifyDataSetChanged()
确保列表知道新数据
问题:
如何将ActivityInstrumentationTestCase2中的测试数据加载到列表视图中,以便数据不仅显示在屏幕上,而且实际上“在那里”,这意味着可以使用list.getChildAt(0)
获取列表项并单击
整个测试用例
公共类ContactListActivityFunctionalTest扩展
ActivityInstrumentationTestCase2{
私人活动;
公共联系人列表活动功能测试(){
超级(ContactListActivity.class);
}
受保护的void setUp()引发异常{
super.setUp();
setActivityInitialTouchMode(假);
activity=getActivity();
}
受保护的void tearDown()引发异常{
super.tearDown();
}
@超线程测试
公共最终作废testLoadContactDetail(){
ListView list=activity.getListView();
assertNotNull(列表);
ContactsListAdapter适配器=新ContactsListAdapter(
getInstrumentation().getContext(),
createData()
);
list.setAdapter(适配器);
adapter.notifyDataSetChanged();
assertNotNull(list.getChildAt(0));
//任何超出这一点的事情都不会被执行,
//因为上面的断言失败了,我也不知道
//如果此测试代码完全正确。
ActivityMonitor监视器=getInstrumentation().addMonitor(
ContactDetailActivity.class.getName(),null,false
);
TouchUtils.clickView(这个,list.getChildAt(0));
ContactDetailActivity ContactDetailActivity=
(ContactDetailActivity)monitor.waitForActivityWithTimeout(2000);
assertNotNull(contactDetailActivity);
assertTrue(getInstrumentation().checkMonitorHit(监视器,1));
contactDetailActivity.finish();
}
私有列表createData(){
ContactInterface contact=新联系人();
联系人设置ID(1L);
联系人。设置名称(“单元测试”)。设置电话(“0123456789”)。设置位置(3);
列表联系人=新建ArrayList();
联系人。添加(联系人);
返回联系人;
}
}
它看起来像列表视图。getChildAt
方法返回可见视图
所以,我猜这个项目还不可见。没有,因为getChildCount返回0。也许你应该:
- 在断言之前请稍等。好的,这是肮脏的,但UI测试需要它的时候
- 在ui线程上的runnable中发布断言,以便在执行listview之后执行它。这将使您的测试变得更加复杂,因为您必须将未来的可运行线程与当前的测试线程同步为倒计时锁存器。为此,您应该考虑不要使用@ uthRealTest.
public class ContactListActivityTest
extends ActivityUnitTestCase<ContactListActivity> {
private ContactListActivity activity;
public ContactListActivityTest() {
super(ContactListActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
Intent intent = new Intent(
getInstrumentation().getTargetContext(), ContactListActivity.class
);
startActivity(intent, null, null);
activity = getActivity();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public final void testItemClick() {
getInstrumentation().callActivityOnStart(activity);
getInstrumentation().callActivityOnResume(activity);
// Check if list exists
ListView list = activity.getListView();
assertNotNull("Intent was null", list);
// Load test data
ContactsListAdapter adapter = new ContactsListAdapter(
getInstrumentation().getContext(),
createData()
);
list.setAdapter(adapter);
adapter.notifyDataSetChanged();
assertEquals(2, adapter.getCount());
// Check if list has at least one item to click
View firstItem = list.getAdapter().getView(0, null, null);
assertNotNull(firstItem);
// Perform a click on the first item
list.performItemClick(
firstItem,
0,
list.getAdapter().getItemId(0)
);
// Check if the contact details activity got started
Intent intent = getStartedActivityIntent();
assertNotNull(intent);
assertEquals(
ContactDetailActivity.class.getName(),
intent.getComponent().getClassName()
);
}
private List<ContactInterface> createData() {
List<ContactInterface> contacts = new ArrayList<ContactInterface>();
ContactInterface contact = new Contact();
contact.setId(1L);
contact.setName("Jane Doe").setPhone("0123456789").setPosition(1);
contacts.add(contact);
ContactInterface contact2 = new Contact();
contact2.setId(2L);
contact2.setName("John Doe").setPhone("0234567890").setPosition(2);
contacts.add(contact2);
return contacts;
}
}
公共类ContactListActivityTest
扩展ActivityUnitTestCase{
私人活动;
公共联系人列表活动测试(){
超级(ContactListActivity.class);
}
受保护的void setUp()引发异常{
super.setUp();
意图=新意图(
getInstrumentation().getTargetContext(),ContactListActivity.class
);
startActivity(意向、无效、无效);
activity=getActivity();
}
受保护的void tearDown()引发异常{
super.tearDown();
}
公共最终无效测试单击(){
getInstrumentation().callActivityOnStart(活动);
getInstrumentation().callActivityOnResume(活动);
//检查列表是否存在
ListView list=activity.getListView();
assertNotNull(“意图为null”,列表);
//负载测试数据
ContactsListAdapter适配器=新ContactsListAdapter(
getInstrumentation().getContext(),
createData()
);
list.setAdapter(适配器);
adapter.notifydatasetha