2016-01-12 8 views
14

Retrofit Mit 1 verwendeten wir mock Web-Services und Netzwerk-Latenz wie folgt simulieren:Wie man Dienste mit Retrofit 2.0 und der neuen MockRetrofit Klasse vortäuscht?

MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter); 
return mockRestAdapter.create(MyService.class, new MyServiceMock()); 

Wo MyService ist der Service Interface (Antworten als Rx Observable Rückkehr) und MyServiceMock ist eine Klasse, die diese Schnittstelle implementiert.

In Retrofit 2.0.0-beta3 gibt es ein brandneues Mocking-System (siehe: https://github.com/square/retrofit/pull/1343), das noch nicht dokumentiert ist. Wenn zu etwas ähnliches versucht, erhalte ich:

MockRetrofit mockRetrofit = new MockRetrofit.Builder(retrofit).build(); 
BehaviorDelegate<AuthService> delegate = mockRetrofit.create(MyService.class); 

Wie leite ich Anrufe MyServiceMock?

+0

Nebenbei bemerkt, können Sie MockWebServer und MockResponse verwenden Web-Services als auch zu simulieren spöttisch. –

+1

Ich denke, Sie könnten von der Verwendung von Spott profitieren. Werfen Sie einen Blick;) https://github.com/VictorAlbertos/Mousery –

Antwort

15

Angenommen, die Schnittstellendefinition ist als unten:

wird
public interface MyService { 
    @GET("/name") 
    rx.Observable<String> name(); 
} 

Anrufe an MyServiceMockBehaviorDelegate Verwendung weitergeleitet werden. Die BehaviorDelegate wendet NetworkBehavior auf die Antworten an, die von dem Schein erstellt werden. Beachten Sie, dass die folgende Implikationsimplementierung das BehaviorDelegate als Konstruktorargument verwendet und es verwendet, um die Antwort zurückzugeben.

public class MyServiceMock implements MyService { 
    private final BehaviorDelegate<MyService> delegate; 

    public MyServiceMock(BehaviorDelegate<MyService> delegate) { 
     this.delegate = delegate; 
    } 

    public Observable<String> name() { 
     return delegate.returningResponse("test").name(); 
    } 
} 

Eine Probe eines Tests der Mock-Dienst wird wie unten dargestellt:

public class MyServiceTest { 

    private final NetworkBehavior behavior = NetworkBehavior.create(); 
    private final rx.observers.TestSubscriber<String> testSubscriber = TestSubscriber.create(); 
    private MyService mockService; 

    @Before 
    public void setUp() throws Exception { 
     Retrofit retrofit = new Retrofit.Builder() 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .baseUrl("http://example.com").build(); 

     MockRetrofit mockRetrofit = new MockRetrofit.Builder(retrofit) 
       .networkBehavior(behavior).build(); 

     final BehaviorDelegate<MyService> delegate = mockRetrofit.create(MyService.class); 

     mockService = new MyServiceMock(delegate); 
    } 

    @Test 
    public void testSuccessResponse() throws Exception { 
     givenNetworkFailurePercentIs(0); 

     mockService.name().subscribe(testSubscriber); 

     testSubscriber.assertValue("test"); 
     testSubscriber.assertCompleted(); 
    } 

    @Test 
    public void testFailureResponse() throws Exception { 
     givenNetworkFailurePercentIs(100); 

     mockService.name().subscribe(testSubscriber); 

     testSubscriber.assertNoValues(); 
     testSubscriber.assertError(IOException.class); 
    } 

    private void givenNetworkFailurePercentIs(int failurePercent) { 
     behavior.setDelay(0, MILLISECONDS); 
     behavior.setVariancePercent(0); 
     behavior.setFailurePercent(failurePercent); 
    } 
} 
+1

Ok, also wenn ich verstehe, werde ich alle meine Mocks neu schreiben müssen, um die folgende Tabelle 'delegate.returning (myMockedValue) .myMethod();' hinzuzufügen . Ich bin nicht sicher, dass dies eine Verbesserung im Vergleich zu Retrofit 1 ist. – clemp6r

+0

Gibt es einen Grund, jemals zu schreiben "delegate.returning (Calls.response (etwas))", wenn Sie 'delegate.returningResponse (etwas) 'nennen können, die Teilt der "Calls.response()" Teil für Sie? – Singed

+1

@Singed - Sie haben Recht. Es gibt keinen Grund, in diesem Fall die Langform zu schreiben. 'returningResponse' kann verwendet werden. Dies kann jedoch nützlich sein, wenn Sie fehlgeschlagene Antworten von Ihrem Mock senden möchten. Beispiel 'delegate.returning (Calls.failure (neue IOException (" irgendein Fehler "))). –