使用Espresso正确断言我在ListView中列出了项目

时间:2017-05-03 08:08:47

标签: android android-testing android-espresso

我想测试Espresso android测试框架,所有预期的标题都显示在ListView中。

我有ListView的Activity,显示目录中的文件。每个ListView项都是Item对象:

/**
 * Item
 */
static class Item {
    private String title;
    private IFileInfo fileInfo;
    private int imageResourceId;

    public Item(String title, IFileInfo fileInfo, int imageResourceId) 
    {
        this.title = title;
        this.fileInfo = fileInfo;
        this.imageResourceId = imageResourceId;
    }

    public IFileInfo getFileInfo() {
        return fileInfo;
    }

    public String getTitle() {
        return title;
    }

    public int getImageResourceId() {
        return imageResourceId;
    }
}

持有人只需为项目设置标题和图像:

/**
 * Adapter
 */
private class Adapter extends ArrayAdapter<Item> {

    private LayoutInflater layoutInflater;

    public Adapter(Context context, List<Item> objects) {
        super(context, 0, objects);
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.file_dialog_row, null);
            convertView.setTag(new Holder(convertView));
        }

        Item item = getItem(position);
        Holder holder = (Holder) convertView.getTag();
        holder.getTitleView().setText(item.getTitle());
        holder.getTitleView().setTextColor(itemColorStateList);
        holder.getImageView().setImageResource(item.getImageResourceId());
        return convertView;
    }
}

项目布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content">

<ImageView android:layout_alignParentLeft="true" android:id="@+id/fdrowimage"
    android:layout_height="wrap_content" android:layout_width="wrap_content"
    android:paddingRight="3dp" android:paddingLeft="3dp"/>

<TextView android:text="@+id/fdrowtext" android:layout_width="wrap_content"
    android:id="@+id/fdrowtext"
    android:layout_alignTop="@+id/fdrowimage" android:layout_alignBottom="@+id/fdrowimage"
    android:gravity="center_vertical" android:layout_height="wrap_content"
    android:textSize="19dp"/>

最初我想用文字&#34; N&#34;来断言该项目。列出了(我有Item个对象的列表,我想为每个对象断言。

要检查它是否真的有用,我已检查过测试应该会因某些实际未显示的项目标题而失败,但由于某种原因测试成功:

onData(allOf(is(instanceOf(Item.class)), withText("someNotListedItemTitle"), isDisplayed()));

这是完整的测试代码:

...

@Test
public void testShowFiles() throws IOException {
    List<File> files = new LinkedList<>();
    for (int i = 0; i < 10; i++) {
        File tmpFile = new File(rootFilesFolder, generateUniqueString());
        files.add(tmpFile);

        if (i % 2 == 0)
            FileUtils.touch(tmpFile); // create file
        else
            FileUtils.forceMkdir(tmpFile); // create folder
    }

    // add not shown for sure in ListView item
    File notExistingListed = new File(rootFilesFolder, generateUniqueString());
    files.add(notExistingListed);

    // activity creates ListView that shows file name for each file in TextView with @+id/fdrowtext
    startActivityForPath(rootFilesFolder);

    for (File eachFile : files) {
        // should fail for `notExistingListed`
        onData(anyOf(is(instanceOf(Item.class)), withText(eachFile.getName()), isDisplayed())); 
    }
}

Espresso的正确断言是什么? 我应该为我的项目创建自定义匹配器吗?

2 个答案:

答案 0 :(得分:0)

我对Espresso测试框架有一些经验。 但我使用的是RecyclerView而不是ListView,此框架中有一些与RecyclerView类似的功能:

onView(withId(R.id.recycler_view)).perform(
            actionOnItemAtPosition(itemPosition, swipeLeft()));

我还为RecyclerView项目做了自定义匹配器,看起来像是:

onView(withRecyclerView(R.id.recycler_view).
                atPositionOnView(itemPosition, R.id.child_view)).
                check(matches(withText("Element 1")));

所以我可以从RecyclerView

中某个位置的任何视图中断言值

如果您需要更多相关信息,请告诉我。

答案 1 :(得分:0)

我能够使用withText代替onData解决问题,但这似乎是一个肮脏的伎俩:

for (File eachFile : files) {
    onView(withText(eachFile.getName())).check(matches(isDisplayed()));
}

onData的正确断言是什么?