Wie verwenden Sie Espresso-test-item-in-adapter an einer bestimmten position

Ich versuche, Espresso (2.0), um zu überprüfen, dass der text in einer Liste an adapter Element an einer bestimmten position korrekt ist, und für das Leben meines ich kann nicht herausfinden, die richtigen Methoden zu nennen.

Mein Adapter-Typ (IconRowAdapter) enthält eine Liste der IconRow Objekte. Jeder IconRow hat eine getText() Methode liefert den text des Elements.

Hier ist die nicht-Espresso-working test, code, der überprüft, dass die IconRow Objekt an position 0 in der adapter hat den erwarteten text ("Künstler").

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

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

Dieser funktioniert.

Ich habe versucht, verschiedene Variationen über die folgenden Espresso-code, um das gleiche zu tun,

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

wo withItemContent() sieht wie folgt aus:

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);
        }
    };
}

Was ich erwarten würde, dass zu tun ist:

  • Die Daten vom adapter, das eine Instanz von IconRowAdapter (von denen es nur eine im-Tätigkeit)...
  • ... finde den Eintrag an der position 0 in die adapter...
  • ... verwenden withItemContent (), um zu überprüfen, dass der text in das Element an dieser position entspricht "Künstler"

Wenn ich Laufe, bekomme ich folgende Fehlermeldung:

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]>

Gibt es 12 Elemente in IconRowAdapter, so habe ich etwas Vertrauen, dass es auf der Suche in den korrekten adapter.

Alle Beispiel-code und Dokumentation, die ich habe finden können, wird davon ausgegangen, dass Sie versuchen zu finden ein Eintrag in den adapter, um es anzuklicken (und dies wird sich in den Wert in irgendeiner anderen Ansicht wechseln). Ich kann nichts finden, dass die Gespräche darüber, wie zu prüfen, wie der Wert eines bestimmten Elements in einem adapter.

Alle Erkenntnisse dankbar angenommen.

Bearbeiten, um hinzuzufügen:

Was funktioniert ist folgende:

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

Verstehe ich das richtig, dass die Prüfung der Wert der R. id.text1 anzeigen, anstatt den Wert in den adapter. Ich denke, das macht Sinn für ein UI-test, aber ich bin immer noch daran interessiert, herauszufinden, wie (ob?) Ich kann verwenden Sie Espresso-test den Inhalt eines Artikels in den adapter.

InformationsquelleAutor Nik | 2014-12-23

Schreibe einen Kommentar