使用doesNotExist的Android Espresso onData

前端之家收集整理的这篇文章主要介绍了使用doesNotExist的Android Espresso onData前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图验证ListView不包含特定项目.这是我正在使用的代码
onData(allOf(is(instanceOf(Contact.class)),is(withContactItemName(is("TestName")))))
      .check(doesNotExist());

名称存在时,由于检查(didNotExist()),我正确地得到错误.当名称不存在时,我收到以下错误,因为allOf(…)不匹配任何内容

Caused by: java.lang.RuntimeException: No data found matching: 
(is an instance of layer.sdk.contacts.Contact and is with contact item name:
is "TestName")

如何获得onData(…)等功能.check(doesNotExist())?

编辑:

通过使用try / catch并检查事件的getCause(),我有一个可怕的黑客来获得我想要的功能.我很想用一种好的技术取而代之.

解决方法

根据Espresso样本,您不能使用onData(…)来检查适配器中是否存在视图.检查一下 – link.阅读“断言数据项不在适配器中”部分.您必须与找到AdapterView的onView()一起使用匹配器.

基于以上链接的Espresso样品:

>匹配器:

private static Matcher<View> withAdaptedData(final Matcher<Object> dataMatcher) {
    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(Description description) {
            description.appendText("with class name: ");
            dataMatcher.describeTo(description);
        }

        @Override
        public boolean matchesSafely(View view) {
            if (!(view instanceof AdapterView)) {
                return false;
            }

            @SuppressWarnings("rawtypes")
            Adapter adapter = ((AdapterView) view).getAdapter();
            for (int i = 0; i < adapter.getCount(); i++) {
                if (dataMatcher.matches(adapter.getItem(i))) {
                    return true;
                }
            }
            return false;
        }
    };
}

>然后是onView(…),其中R.id.list是适配器ListView的id:

@SuppressWarnings("unchecked")
public void testDataItemNotInAdapter(){
    onView(withId(R.id.list))
        .check(matches(not(withAdaptedData(is(withContactItemName("TestName"))))));
}

还有一个建议 – 避免写入是(withContactItemName(is(“TestName”))将以下代码添加到匹配器:

public static Matcher<Object> withContactItemName(String itemText) {
        checkArgument( itemText != null );
        return withContactItemName(equalTo(itemText));
    }

然后你会有更多可读和清晰的代码(withContactItemName(“TestName”))

猜你在找的Android相关文章