使用doesNotExist的Android Espresso onData

问题描述 投票:6回答:1

我试图验证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(),我有一个可怕的黑客来获得我想要的功能。我很想用一种好的技术取而代之。

android android-espresso
1个回答
13
投票

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

基于以上链接的Espresso样品:

  1. 比赛: 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; } }; }
  2. 那么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")

© www.soinside.com 2019 - 2024. All rights reserved.