2014-01-16 22 views
6

ListViewに特定のアイテムが含まれていないことを確認しようとしています。ここで私が使用しているコードです:doesnotExistでAndroid Espresso onData

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())ような機能を得ることができますか?

EDIT:

私はのtry/catchを使用して、イベントのgetCause()を検査することで希望の機能性を得るためにひどいハックを持っています。私はこれを良いテクニックに置き換えることが大好きです。

答えて

12

エスプレッソサンプルによれば、onData(...)を使用して、ビューがアダプタに存在しないかどうかを確認しないでください。これをチェックしてください - link。 「データ項目がアダプタに含まれていないことをアサートする」を参照してください。 MatcherとonView()を一緒に使用すると、AdapterViewが見つかります。その後、

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; 
     } 
    }; 
} 
  • R.id.listは、アダプタのリストビューのIDですonView(...)、::

    1. マッチャー:

      @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.equals(null))); 
         return withContactItemName(equalTo(itemText)); 
        } 
    

    、あなたがより読みやすく、明確なコードis(withContactItemName("TestName")

  • +3

    を持っていますドキュメントはこちらに移動しました:https://でグーグルを.github.io/android-testing-support-library/docs/espresso/advanced /#asserting-that-a-data-item-in-an-adaptor – friedger

    関連する問題