6

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() を検査することで、必要な機能を取得するためのひどいハックを持っています。これを良い技術に置き換えたいと思います。

4

1 に答える 1

14

Espresso のサンプルによるとonData(...)、ビューがアダプターに存在しないかどうかを確認するために使用してはなりません。このリンクをチェックしてください。「データ項目がアダプターにないことをアサートする」の部分を読んでください。onView()AdapterView を検出するマッチャーを一緒に使用する必要があります。

上記のリンクからのエスプレッソのサンプルに基づく:

  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"))もう 1 つの提案 -以下のコードをマッチャーに追加することを避けるために:

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

そうすれば、より読みやすく明確なコードが得られますis(withContactItemName("TestName")

于 2014-01-16T23:30:21.020 に答える