2017-12-28 6 views
0

Der Test - Ich habe eine Espresso-Test-Suite entwickelt, um einige komplexe Entscheidungen mit einem RecyclerView-Adapter zu testen.Kann ich RecyclerView in Espresso ohne Aktivität testen?

Für einen Test beabsichtige ich, einen RecyclerView zu erstellen, den getesteten Adapter zu übergeben und dann festzustellen, dass die richtige Anzahl von Kindern existiert, wobei die richtigen Elemente sichtbar sind.

Das Problem - ich dies ohne eine bestimmte Aktivität in Isolation am Testen, was bedeutet, dass der folgende Code nie passiert, weil die RecyclerView nie seine Kinder legt:

RecyclerView rv = new RecyclerView(InstrumentationRegistry.getTargetContext()); 
rv.setAdapter(adap); 
assertThat(rv.getChildCount(), is(greaterThan(0))); 

ich Ich mache übernehmen könnte Dies funktioniert, indem Sie eine leere Aktivität und ein leeres Layout mit dem RecyclerView erstellen, aber ich möchte vermeiden, solche Müllklassen zu erstellen.

Die Frage - Ist es möglich, dass der RecyclerView so funktioniert? Hat Espresso eine Grundansicht, auf die ich zugreifen kann?

+0

Sie könnten versuchen, 'measure()' und 'layout()' direkt auf dem 'RecyclerView' aufzurufen und zu überprüfen, ob das ausreicht, um das zu tun, was Sie suchen. – CommonsWare

+0

Danke für den Vorschlag. Ich habe tatsächlich 'measure (View.MeasureSpec.AT_MOST, View.MeasureSpec.AT_MOST)' und 'layout (0,0, rv.getHeight(), rv.getWidth())' zusammen versucht, aber das hat nichts erreicht –

+0

Ich würde konkrete Werte (z. B. Höhe von 800, Breite von 480) verwenden, obwohl das nicht helfen kann. Es funktioniert mit grundlegenden Layouts (z. B. "LinearLayout"), aber ich habe dies nie mit einem "RecyclerView" versucht. Sie müssen möglicherweise auch zwischen den 'measure()'/'layout()' Aufrufen im Leerlauf und überprüfen Sie die 'RecyclerView', da' RecyclerView' könnte 'post()' -ing einige Arbeit oder auf andere Weise erfordert ein paar Durchläufe durch die Haupt "Looper", bevor es fertig ist. Am Ende können Sie Ihren 'RecyclerView.Adapter' direkt testen, anstatt' RecyclerView' zu testen, der zufällig Ihren Adapter benutzt. – CommonsWare

Antwort

0

Wie von CommonsWare festgestellt, ist der Weg, um sicherzustellen, dass RecyclerView zum Testen bereit ist, ohne eine Aktivität ist, Layout selbst zu erzwingen.

RecyclerView rv = new RecyclerView(InstrumentationRegistry.getTargetContext()); 
rv.setLayoutManager(new LinearLayoutManager(InstrumentationRegistry.getTargetContext())); 
rv.setAdapter(adapter); 
rv.measure(View.MeasureSpec.AT_MOST, View.MeasureSpec.AT_MOST); 
rv.layout(0,0, 800, 480); //arbitrary sizes 

Nach Ihrer Ansicht nach auf diese Weise erstellen, wird das Kind zählen Null

assertThat(rv.getChildCount(), is(greaterThan(0))); 

nicht mehr Die einzige Einschränkung die RecyclerView ohne Aktivität zu testen, Sie nicht in der Lage sind, Aktionen auszuführen.

onView(...).perform(click()); 

Ohne Aktivität wird dieser Code eine Runtime mit der

Keine gefundenen Aktivitäten Nachricht werfen. Haben Sie vergessen, die Aktivität durch Aufruf von getActivity() oder startActivitySync oder ähnlichem zu starten?

Verwandte Themen