我正在尝试验证ListView不包含特定项目。这是我正在使用的代码:

onData(allOf(is(instanceOf(Contact.class)), is(withContactItemName(is("TestName")))))
      .check(doesNotExist());

名称存在时,由于check(doesNotExist()),我正确地收到了一个错误。如果名称不存在,则会出现以下错误,因为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(...)来检查适配器中是否不存在 View 。检查这个out-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"))))));
    }
    

  • 还有一个建议-为避免编写is(withContactItemName(is("TestName")),请在匹配器中添加以下代码:
        public static Matcher<Object> withContactItemName(String itemText) {
            checkArgument( itemText != null );
            return withContactItemName(equalTo(itemText));
        }
    

    那么您将获得更具可读性和清晰性的代码is(withContactItemName("TestName")

    关于android - 具有didNotExist的Android Espresso onData,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21173253/

    10-09 03:46