Unit Test - Verifiziere, dass Observable abonniert ist

8

Ich habe den Java-Code wie folgt

%Vor%

und ich möchte verify das folgende Observable wird .subscribe()

Ich habe versucht, getObservable() und verify

vorzuspielen %Vor%

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()

nicht tun

Irgendwelche Vorschläge in diesem Fall?

    
Kone Man 09.11.2016, 04:47
quelle

4 Antworten

1

Ich habe festgestellt, dass RxJava eine Klasse namens TestSubject

anbietet

Sie können es so erstellen

%Vor%

Damit erhalten Sie die Methode hasObservers() , die einen booleschen Wert zurückgibt.

%Vor%

Mit dem TestSubject können Sie auch genau einstellen, wann Ereignisse gesendet werden sollen.

%Vor%     
Altoyyr 30.01.2017 11:59
quelle
1

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%     
michalsamek 22.12.2016 23:46
quelle
0

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.

    
methodsignature 12.05.2017 14:01
quelle
0

Ich verbrachte heute Stunden und merke, dass es ein dummer Fehler war. Überprüfen Sie Ihren @ PrepareForTest, wenn Sie PowerMockito verwenden.

%Vor%

Vergessen Sie auch nicht, es zu verspotten. Ich habe es auf @before getan:

%Vor%

Ich hoffe, es kann helfen. Danke

    
surga 01.03.2018 10:51
quelle