Testen von RxJava2 mit Espresso und Abrufen einer Nullzeiger-Ausnahme bei suscribeOn

8
%Vor%

Ich teste gerade eine Liste für einen Endpunkt mit RxJava2. Die App funktioniert einwandfrei, wenn sie normal läuft. Wenn ich jedoch einen Espresso benutze, erhalte ich eine Nullzeiger-Ausnahme, wenn ich subscribeOn(scheduler) versuche. Für die Scheduler verwende ich die trampoline() für beide subscribeOn und observeOn , die injiziert werden.

%Vor%

Zum Testen von RxJava2 mit Espresso sollte ich etwas machen, das für subscribeOn und observeOn anders ist?

%Vor%

Dies ist meine Klasse im Test

%Vor%

Die Schnittstelle für die Scheduler ist hier und zum Testen verwende ich ein Trampolin, das injiziert wird

%Vor%

Mock-Modul für RecipeAPI

%Vor%

So werden die Komponenten erstellt

%Vor%

Und für den Expresso-Test mache ich folgendes:

%Vor%

Stapelverfolgung:

%Vor%

Vielen Dank für Anregungen,

    
ant2009 16.08.2017, 15:39
quelle

1 Antwort

6

In Ihrer Codebasis gibt es zahlreiche Probleme. Aber in erster Linie folgt folgendes: Sie inspizieren irgendwie neue reale Objekte (keine Mocks) und deshalb erhalten Sie NPE, da ist nichts mit subscribeOn() zu tun.

  1. Sie sollten Ihre Testkomponente von Ihrer Produktionskomponente ausdehnen. Derzeit ist es nicht .

    %Vor%
  2. In Ihrer Testanwendungsklasse mischen Sie Callbacks, d. h. Sie erstellen TestRecipeListComponent innerhalb von createApplicationComponent Callback, aber Sie haben einen anderen Callback dafür: createRecipeListComponent() .

  3. Du solltest nicht jedes einzelne in deinem MockRecipeListModule ausspionieren. Nur spotten Komponente, die Sie wirklich verspotten müssen. Wenn Sie zum Beispiel RecipeAdapter vortäuschen, wie können Sie dann erwarten, dass die Recycler-Ansicht alles auf dem Bildschirm zeichnet? Sie müssen nur den Datenquellenanbieter ausspionieren, was in Ihrem Fall RecipeApi ist. Abgesehen davon, dass nichts verspottet werden sollte, ist dies kein Unit-Test, das ist Instrumentierungstest.

  4. In RecipeListView#onCreate() erstellen Sie eine neue RecipeListComponent , während Sie nicht sollten, sollten Sie diese Komponente aus der Klasse Application holen, da Sie sie dort bereits erstellt haben . Dies wirkt sich auf die Tests aus: Sie können Abhängigkeiten nicht von dort aus steuern, da RecipeListView alle Abhängigkeiten, die Sie aus Tests geändert haben, einfach ignoriert und eine neue Komponente erstellt, die andere Abhängigkeiten liefert, also würden Ihre Stubs nicht gebe die Daten zurück, die du im Test explizit hart codiert hast (tatsächlich werden sie nicht einmal aufgerufen, reale Objekte wären es). Genau davon haben Sie das Problem erfahren.

Ich habe das alles behoben. Ich bin an einen Punkt gekommen, an dem die Behauptung, die du geschrieben hast, nicht besteht. Sie sollten sich die Mühe machen, damit fortzufahren, weil es mit der Logik / Architektur verbunden ist, die Sie verwenden.

Ich habe eine Pull-Anfrage hier geöffnet.

    
azizbekian 21.08.2017, 01:08
quelle