2017-05-03 32 views
1

我想测试与Espresso Android测试框架,所有预期的标题显示在ListView中。正确声称与浓咖啡我列出的项目ListView

我有活动ListView显示目录中的文件。每个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"/> 

本来我想断言与文本“N”的项目被列出(我有一个列表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的正确断言是什么? 我应该为我的物品创建自定义匹配器吗?

回答

0

我有一些Espresso测试框架的经验。 但我用RecyclerView代替ListView并有在这个框架有关RecyclerView像一些功能:

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

而且我也做了定制匹配的RecyclerView项目,看起来像:

​​

所以我可以从某个位置的任何视图断言值RecyclerView

请让我知道你是否需要关于它的更多信息。

+0

“ListView”和“RecyclerView”之间存在显着差异,如下所示:https://google.github.io/android-testing-support-library/docs/espresso/lists/ – 4ntoine

0

我能够与withText而不是onData要解决它,但它似乎是一个肮脏的伎俩:

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

什么是正确onData断言?