Ich habe den Java-Code wie folgt
%Vor% und ich möchte verify
das folgende Observable wird .subscribe()
Ich habe versucht, getObservable()
und verify
Aber es gibt einen Fehler
%Vor% Ich denke, es ist nicht möglich mock
an Observable hier, aber ohne ein verspottetes Observable kann ich verify(res).subscribe()
Irgendwelche Vorschläge in diesem Fall?
Ich habe festgestellt, dass RxJava eine Klasse namens TestSubject
Sie können es so erstellen
%Vor% Damit erhalten Sie die Methode hasObservers()
, die einen booleschen Wert zurückgibt.
Mit dem TestSubject können Sie auch genau einstellen, wann Ereignisse gesendet werden sollen.
%Vor% Vielleicht könnten Sie Observable.onSubscribe
Methode zusammen mit RunTestOnContext
Regel verwenden? Das TestContext
kann Ihnen ein Objekt Async
liefern, das den Test erst beendet, wenn es abgeschlossen ist. Ich denke, wenn du das mit Observable#doOnSubscribe
kombinierst, kannst du das gewünschte Verhalten erreichen.
Die Verwendung von Async
könnte jedoch manchmal etwas verwirrend sein. Wenn im folgenden Beispiel die Observable nie abonniert wird, wird die doOnSubscribe
-Funktion niemals ausgewertet und Ihr Test wird nicht beendet.
Beispiel:
%Vor%Ich bin mir nicht sicher, ob ich die gestellte Frage beantworte, aber ich denke so ...
Es können Unit-Tests erstellt werden, die prüfen, ob an einer Observable eine Subskription vorgenommen wurde. Beachten Sie, dass dies in RxJava 1.x mit TestSubject unterstützt wurde, aber diese Funktionalität kann durch Subject-Implementierungen erleichtert werden. TestSubject wurde für RxJava 2 gelöscht .
Anstatt zu versuchen, das Observable zu verspotten, wie es das ursprüngliche Poster versucht, verwenden Sie ein PublishSubject, führen Sie die Geschäftslogik aus und verwenden Sie dann das publish-Subjekt, um zu sehen, ob das Observable beobachtet wird. Im Folgenden finden Sie einen Testcode, mit dem dieser Test validiert werden kann. Die Tests passieren, wenn ich sie ausführen.
Siehe Codekommentare für die Beschreibung des Codes. Persönlich erscheint dieser Test für andere Tests redundant, die überprüfen würden, wie der Controller Daten handhabt. Diese anderen Tests würden fehlschlagen, wenn der Controller niemals Daten vom Datendienst abonniert und empfangen würde. Auf der anderen Seite hilft Testing Abbestellen Speicherverluste zu vermeiden, die wahrscheinlich hohen Wert ist.
%Vor%- bearbeiten - Ich habe vorher geschrieben, dass ich nicht testen konnte, ob ich mich abmelden konnte. Ich habe herausgefunden, wie ich das testen kann. Es stellt sich heraus, dass mein Test fehlgeschlagen ist, weil der getestete Code nicht ordnungsgemäß abbestellt wurde (hah - testing works, go figure). Ich habe den obigen Code aktualisiert, um zu veranschaulichen, ob sowohl Abonnieren als auch Abbestellen möglich ist.
Tags und Links java unit-testing rx-java mockito observable