Comment utiliser l'Espresso à l'élément d'essai dans l'adaptateur à une position spécifique

Je suis en train d'utiliser Espresso (2.0) pour vérifier que le texte dans une liste d'adaptateur élément à une position donnée est correcte, et pour la vie de mon je ne peux pas comprendre les bonnes méthodes à appeler.

Mon type de Carte (IconRowAdapter) contient une liste de IconRow objets. Chaque IconRow a un getText() méthode qui retourne le texte de l'élément.

Ici est la non-Espresso de travail code de test qui vérifie que le IconRow objet à la position 0 à la carte a prévu de texte ("Artistes").

public void testHomeActivityMenu() {
    ListView list = (ListView) getActivity().findViewById(R.id.item_list);
    IconRowAdapter adapter = (IconRowAdapter) list.getAdapter();

    assertEquals(adapter.getItem(0).getText(), "Artists");
}

Cela fonctionne.

J'ai essayé un assortiment de variations sur la suite à Espresso code pour faire la même chose,

onData(is(instanceOf(IconRowAdapter.class)))
        .atPosition(0)
        .check(matches(withItemContent("Artists")));

withItemContent() ressemble à ceci:

public static Matcher<Object> withItemContent(String expectedText) {
    checkNotNull(expectedText);
    return withItemContent(equalTo(expectedText));
}

@SuppressWarnings("rawtypes")
public static Matcher<Object> withItemContent(final Matcher<String> itemTextMatcher) {
    checkNotNull(itemTextMatcher);
    return new BoundedMatcher<Object, IconRow>(IconRow.class) {
        @Override
        public boolean matchesSafely(IconRow iconRow) {
            return itemTextMatcher.matches(iconRow.getText());
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("with item content: ");
            itemTextMatcher.describeTo(description);
        }
    };
}

Ce que je m'attends à que faire est:

  • Obtenir les données de la carte qui est une instance de IconRowAdapter (dont il n'y a qu'un dans l'activité)...
  • ... trouver l'entrée à la position 0 à la carte...
  • ... utiliser withItemContent() pour vérifier que le texte dans l'élément à cette position correspond à des "Artistes"

Quand je lance que j'obtiens l'erreur suivante:

Caused by: java.lang.RuntimeException: No data found matching: is an instance of 
uk.org.ngo.squeezer.IconRowAdapter contained values: <[Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585980 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 0, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b15859e0 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 1, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a00 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 2, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a20 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 3, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a40 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 4, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a60 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 5, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a80 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 6, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585aa0 (class:  
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 7, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ac0 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 8, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ae0 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 9, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b00 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 10, Data: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b20 (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 11]>

Il y a 12 éléments dans IconRowAdapter, donc j'ai peu de confiance qu'il est à la recherche de la bonne carte.

Tous les exemples de code et de la documentation que j'ai pu trouver suppose que vous essayez de trouver une entrée dans l'adaptateur pour cliquer sur elle (et que le résultat sera la valeur de certains autres de vue changement). Je ne trouve rien qui parle de comment comment vérifier la valeur d'un élément donné dans un adaptateur.

Des idées reçues avec reconnaissance.

Modifier pour ajouter:

Ce qui fonctionne est la suivante:

onData(anything())
.inAdapterView(withId(R.id.item_list))
.atPosition(0)
.check(matches(hasDescendant(
allOf(withId(R.id.text1), withText(containsString("Artists"))))));

Si je comprends bien c'est tester la valeur de la R. id.texte1 vue, plutôt que de la valeur de la carte. Je suppose que le sens d'un test de l'INTERFACE utilisateur, mais je suis toujours intéressé à trouver comment faire (si?) Je peux utiliser l'Espresso à tester le contenu d'un élément dans l'adaptateur.

OriginalL'auteur Nik | 2014-12-23