gpt4 book ai didi

java - 如何使用 Retrofit 2.0 和新的 MockRetrofit 类模拟服务?

转载 作者:太空狗 更新时间:2023-10-29 22:53:37 27 4
gpt4 key购买 nike

我们使用 Retrofit 1 来模拟 Web 服务并模拟网络延迟,如下所示:

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

其中 MyService 是服务接口(interface)(返回响应作为 Rx Observables),MyServiceMock 是实现此接口(interface)的类。

在 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);

如何将调用转发到 MyServiceMock

最佳答案

假设接口(interface)定义如下:

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

调用将使用 BehaviorDelegate 转发到 MyServiceMockBehaviorDelegateNetworkBehavior 应用于模拟创建的响应。请注意,下面的模拟实现将 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();
}
}

使用模拟服务的测试示例如下所示:

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);
}
}

关于java - 如何使用 Retrofit 2.0 和新的 MockRetrofit 类模拟服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34740665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com