java 如何使用 Retrofit 2.0 和新的 MockRetrofit 类模拟服务?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34740665/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to mock services with Retrofit 2.0 and the new MockRetrofit class?
提问by clemp6r
Using Retrofit 1 we used to mock web services and simulate network latency as following:
我们使用 Retrofit 1 模拟 Web 服务并模拟网络延迟,如下所示:
MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter);
return mockRestAdapter.create(MyService.class, new MyServiceMock());
Where MyService
is the service Interface (returning responses as Rx Observables), and MyServiceMock
is a class that implements this interface.
MyService
服务接口在哪里(作为 Rx Observables 返回响应),MyServiceMock
是一个实现这个接口的类。
In Retrofit 2.0.0-beta3 there is a brand new mocking system (see: https://github.com/square/retrofit/pull/1343) that is not yet documented. When trying to to something similar I get:
在 Retrofit 2.0.0-beta3 中,有一个全新的模拟系统(参见:https: //github.com/square/retrofit/pull/1343)尚未记录。当试图做类似的事情时,我得到:
MockRetrofit mockRetrofit = new MockRetrofit.Builder(retrofit).build();
BehaviorDelegate<AuthService> delegate = mockRetrofit.create(MyService.class);
How do I forward calls to MyServiceMock
?
如何将呼叫转接到MyServiceMock
?
回答by Praveer Gupta
Suppose the interface definition is as below:
假设接口定义如下:
public interface MyService {
@GET("/name")
rx.Observable<String> name();
}
Calls will be forwarded to MyServiceMock
using BehaviorDelegate
. The BehaviorDelegate
applies NetworkBehavior
to the responses created by the mock. Note that the mock implementation below takes the BehaviorDelegate
as a constructor argument and uses it to return the response.
呼叫将被转接到MyServiceMock
使用BehaviorDelegate
. 将BehaviorDelegate
适用NetworkBehavior
于由模拟产生的反应。请注意,下面的模拟实现将BehaviorDelegate
用作构造函数参数并使用它来返回响应。
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();
}
}
A sample of a test using the mock service is as shown below:
使用模拟服务的测试示例如下所示:
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);
}
}