Was ist der beste Weg, um einen Server zum Testen zu verspotten, wenn das Square Retrofit Framework verwendet wird ? .
Mögliche Wege:
Erstellen Sie ein neues Nachrüst - Client und stellen Sie ihn in der RestAdapter.Builder (). SetClient (). Dies beinhaltet das Parsen des Anforderungsobjekts und das Zurückgeben des JSON als Antwortobjekt.
Implementieren Sie diese mit Anmerkungen versehene Schnittstelle als Scheinklasse und verwenden Sie diese anstelle der von RestAdapter.create () bereitgestellten Version (testet die gson-Serialisierung nicht).
?
Idealerweise möchte ich, dass der verspottete Server JSON-Antworten bereitstellt, damit ich gleichzeitig die Gson-Serialisierung testen kann.
Alle Beispiele wäre sehr dankbar.
square-oss
? Es scheint überflüssig gegebenretrofit
.Antworten:
Mock Retrofit 2.0-Testanforderungen
Da die alten Mechanismen wie das Erstellen
MockClient
und Implementieren von KlassenClient
mit Retrofit 2.0 nicht mehr funktionieren, beschreibe ich hier eine neue Methode. Alles, was Sie jetzt tun müssen, ist, Ihre benutzerdefinierten Interceptors für OkHttpClient hinzuzufügen, wie unten gezeigt .FakeInterceptor
Klasse überschreibt nurintercept
Methode und in dem Fall, wenn Anwendung in istDEBUG
Modus befindet, wird JSON zurückgegeben.RestClient.java
IRestService.java
FakeInterceptor.java
Quellcode des Projekts auf GitHub
quelle
uri()
Unterchain.request().uri()
(ich habe dies behoben, indemString url = chain.request().url().toString();
mein Fall anders war). 2- Ich bekommejava.lang.IllegalStateException: network interceptor my.package.name.FakeInterceptor must call proceed() exactly once
. Ich habe diesaddNetworkInterceptor()
eher hinzugefügt alsaddInterceptor()
.Ich habe mich entschlossen, Methode 1 wie folgt auszuprobieren
Und mit:
Es funktioniert gut und ermöglicht es Ihnen, Ihre JSON-Zeichenfolgen zu testen, ohne den realen Server kontaktieren zu müssen!
quelle
IllegalArgumentException url == null
mit Retrofit 1.4.1 einen ausgelöst hat.builder.setEndpoint("http://mockserver.com").setClient(new MockClient());
Das Testen der JSON-Deserialisierung für Ihre Objekte (vermutlich mit
TypeAdapters
?) Scheint ein separates Problem zu sein, das separate Komponententests erfordert.Ich benutze Version 2 persönlich. Es bietet typsicheren, refaktorfreundlichen Code, der leicht debuggt und geändert werden kann. Was nützt es schließlich, Ihre API als Schnittstellen zu deklarieren, wenn Sie keine alternativen Versionen davon zum Testen erstellen! Polymorphismus für den Sieg.
Eine andere Option ist die Verwendung von Java
Proxy
. Auf diese Weise implementiert Retrofit (derzeit) die zugrunde liegende HTTP-Interaktion. Dies wird zwar mehr Arbeit erfordern, würde aber viel dynamischere Verspottungen ermöglichen.quelle
Sie können auch so etwas wie Webservermock von Squareup verwenden! -> https://github.com/square/okhttp/tree/master/mockwebserver
quelle
Ich bin ein großer Fan von Apiary.io weil eine API verspottet habe, bevor auf einen echten Server .
Sie können auch flache .json-Dateien verwenden und diese aus dem Dateisystem lesen.
Sie können auch öffentlich zugängliche APIs wie Twitter, Flickr usw. verwenden.
Hier sind einige andere großartige Ressourcen zu Retrofit.
Folien: https://docs.google.com/presentation/d/12Eb8OPI0PDisCjWne9-0qlXvp_-R4HmqVCjigOIgwfY/edit#slide=id.p
Video: http://www.youtube.com/watch?v=UtM06W51pPw&feature=g-user-u
Beispielprojekt: https://github.com/dustin-graham/ucad_twitter_retrofit_sample
quelle
Spott (Haftungsausschluss: Ich bin der Autor) wurde genau für diese Aufgabe entwickelt.
Mockery ist eine Verspottungs- / Testbibliothek, die sich auf die Validierung von Netzwerkebenen mit integrierter Unterstützung für Retrofit konzentriert. Es generiert automatisch JUnit-Tests basierend auf den Spezifikationen einer bestimmten API. Die Idee ist, keinen Test manuell schreiben zu müssen; Weder Implementieren von Schnittstellen zum Verspotten von Serverantworten.
quelle
Erstellen Sie zunächst Ihre Nachrüstschnittstelle.
Ihr Antragsteller folgt:
Wenn Sie die zweite Option verwenden (Retrofit-Schnittstelle zum Verspotten von Serverdaten verwenden), müssen Sie MockRetrofit verwenden. Verwenden Sie den folgenden Code:
4. Meine Daten stammen aus einer Asset-Datei (Asset / Server / EventList.json). Der Inhalt dieser Datei lautet:
5.Wenn Sie den Okhttp3-Interceptor verwenden, müssen Sie den Interceptor wie folgt selbst definieren:
6. Schließlich können Sie Ihren Server mit Code anfordern:
Danke fürs Lesen.
quelle
Durch Hinzufügen zur Antwort von @Alec habe ich den Mock-Client erweitert, um die Antwort abhängig von der Anforderungs-URL direkt aus einer Textdatei im Asset-Ordner abzurufen.
Ex
Hier versteht der Mock-Client, dass die URL, die ausgelöst wird, aktiviert ist, und sucht im Ordner "Assets" nach einer Datei mit dem Namen "activ.txt". Es liest den Inhalt aus der Datei assets / enabled.txt und sendet ihn als Antwort für die API.
Hier ist die erweiterte
MockClient
Eine ausführliche Erklärung finden Sie in meinem Blog unter
http://www.cumulations.com/blogs/13/Mock-API-response-in-Retrofit-using-custom-clients
quelle
MockClient
Datei einen statischen Dateinamen angegeben und eine Testklasse mit robolectric geschrieben. Ich kann jedoch keine Antwort von der JSON-Datei erhalten.JSONPlaceholder: Gefälschte Online-REST-API zum Testen und Prototyping
https://jsonplaceholder.typicode.com/
ReqresIn: Eine weitere Online-REST-API
https://reqres.in/
Postbote Mock Server
Wenn Sie angepasste Antwortnutzdaten testen möchten, entsprechen die beiden oben genannten möglicherweise nicht Ihren Anforderungen. Dann können Sie den Postman-Mock-Server ausprobieren. Es ist recht einfach einzurichten und flexibel, um Ihre eigenen Anforderungs- und Antwortnutzdaten zu definieren.
https://learning.getpostman.com/docs/postman/mock_servers/intro_to_mock_servers/ https://youtu.be/shYn3Ys3ygE
quelle
Das Verspotten von API-Aufrufen mit Retrofit ist mit Mockinizer jetzt noch einfacher, was die Arbeit mit MockWebServer wirklich einfach macht:
Erstellen Sie einfach eine Karte mit RequestFilter und MockResponses und fügen Sie sie dann in Ihre Builder-Kette OkHttpClient ein:
Sie müssen sich nicht um die Konfiguration von MockWebServer usw. kümmern. Fügen Sie einfach Ihre Mocks hinzu, der Rest wird von Mockinizer für Sie erledigt.
(Haftungsausschluss: Ich bin der Autor von Mockinizer)
quelle
Für mich ist der benutzerdefinierte Retrofit-Client aufgrund seiner Flexibilität großartig. Insbesondere wenn Sie ein DI-Framework verwenden, können Sie das Mock schnell und einfach ein- und ausschalten. Ich verwende den von Dagger bereitgestellten benutzerdefinierten Client auch für Unit- und Integrationstests.
Bearbeiten: Hier finden Sie ein Beispiel für eine spöttische Nachrüstung https://github.com/pawelByszewski/retrofitmock
quelle