我试图使用espresso(2.0)来验证给定位置列表适配器项中的文本是否正确,并且在我的一生中,我无法找到正确的调用方法。
我的适配器类型(IconRowAdapter)包含IconRow对象的列表。每个iconrow都有一个返回该项文本的getText()方法。
下面是非浓缩咖啡工作测试代码,用于验证适配器中位置0处的iconrow对象是否具有预期的文本(“艺术家”)。

public void testHomeActivityMenu() {
    ListView list = (ListView) getActivity().findViewById(R.id.item_list);
    IconRowAdapter adapter = (IconRowAdapter) list.getAdapter();

    assertEquals(adapter.getItem(0).getText(), "Artists");
}

这是可行的。
我试过各种不同的浓缩咖啡代码来做同样的事情,
onData(is(instanceOf(IconRowAdapter.class)))
        .atPosition(0)
        .check(matches(withItemContent("Artists")));

其中withItemContent()如下所示:
public static Matcher<Object> withItemContent(String expectedText) {
    checkNotNull(expectedText);
    return withItemContent(equalTo(expectedText));
}

@SuppressWarnings("rawtypes")
public static Matcher<Object> withItemContent(final Matcher<String> itemTextMatcher) {
    checkNotNull(itemTextMatcher);
    return new BoundedMatcher<Object, IconRow>(IconRow.class) {
        @Override
        public boolean matchesSafely(IconRow iconRow) {
            return itemTextMatcher.matches(iconRow.getText());
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("with item content: ");
            itemTextMatcher.describeTo(description);
        }
    };
}

我希望这样做是:
从作为iconrowadapter实例的适配器(活动中只有一个)获取数据…
…在适配器中的位置0处查找条目…
…使用withitemcontent()检查该位置项中的文本是否与“艺术家”匹配
当我运行时,得到以下错误:
Caused by: java.lang.RuntimeException: No data found matching: is an instance of
uk.org.ngo.squeezer.IconRowAdapter contained values: <[Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585980 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 0, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b15859e0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 1, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 2, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 3, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a40 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 4, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a60 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 5, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a80 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 6, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585aa0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 7, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ac0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 8, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ae0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 9, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 10, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 11]>

iconrowadapter中有12个项,因此我确信它正在寻找正确的适配器。
我找到的所有示例代码和文档都假设您正试图在适配器中找到一个条目以便单击它(这将导致其他视图中的值发生更改)。我找不到任何关于如何检查适配器中给定项的值的内容。
感激地接受了任何见解。
编辑添加:
工作原理如下:
onData(anything())
        .inAdapterView(withId(R.id.item_list))
        .atPosition(0)
        .check(matches(hasDescendant(
                allOf(withId(R.id.text1), withText(containsString("Artists"))))));

如果我理解正确,那就是测试r.id.text1视图的值,而不是适配器中的值。我想这对于ui测试来说是有意义的,但是我仍然对如何(如果?)我可以用浓缩咖啡来测试适配器中某个项目的内容。

最佳答案

作为参数传递给onData()的匹配器必须与Adapter.getItem()返回的值匹配。
所以第一个版本不匹配,因为使用了错误的类型。应该是:

onData(is(instanceOf(IconRowAdapter.IconRow.class)))

在不同的字符序列上使用equalto也是一个陷阱。string是一个charsequence,但是如果iconrow.gettext()返回charsequence而不是string,那么它也可以是可扩展的、可编辑的等,在这种情况下equalto将不匹配。因此,如果iconrow.getText()返回字符串以外的任何内容,请确保在比较之前将其转换为字符串。

关于android - 如何使用Espresso在特定位置测试适配器中的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27623800/

10-12 02:27