当前位置: 首页 > 面试题库 >

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

金兴朝
2023-03-14
问题内容

通过使用Retrofit 1,我们曾经模拟了Web服务并模拟了网络延迟,如下所示:

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

MyService服务接口在哪里(将响应作为Rx Observables返回),并且MyServiceMock是实现此接口的类。

在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


问题答案:

假设接口定义如下:

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

通话将被转发到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();
    }
}

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

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


 类似资料:
  • 如何模拟服务类中使用的助手方法。我试着找,但找不到,你能指导我吗?如何模拟服务类中使用的助手方法。我试着找,但找不到,你能指导我吗? 服务类功能: public void checkExistance(字符串名称){ } 这是测试逻辑:@SpringBootTest@RunWith(MockitoJUnitRunner.class)公共类ApiUsageServiceTests{MongoOper

  • 我在Postman中运行了一个模拟服务器,我可以使用GET命令等访问它。 例如,我还可以从web浏览器中查看GET命令 这一切都很好,我的问题是当我尝试从IntelliJ访问模拟服务器时。该过程超时,如下所示。 任何想法请,提前谢谢。 已断开与目标VM的连接,地址:“127.0.0.1:55142”,传输:“socket” 进程结束,退出代码1

  • 问题内容: 我使用的是react-router,因此我将组件用于整个应用程序中的链接,在某些情况下,我需要根据用户输入动态生成链接,因此需要类似的内容 ,但无需刷新页面。 我发现了这个小笔记-(https://github.com/rackt/react- router/issues/835 )-我尝试使用,但是上下文有问题… 这导致我(https://github.com/rackt/react

  • 问题内容: 我试图遵循这个非常相似的问题的答案中提供的示例,但是它对我不起作用。我收到以下错误消息: 我需要一个简单的模拟实例。我不需要模拟任何方法。 这是我要模拟的课程: 我有以下TestNG设置: 问题答案: 我通过扩展PowerMockTestCase类来完成这项工作,该类为TestNG处理此类事情:

  • 我想使用Swagger YML文件生成一个模拟服务器,供其他服务连接(例如,前端应用程序连接到模拟API)。

  • 这个问题有很多变体,但大多数都很古老,根本没有真正回答这个问题。我不是问如何安装播放服务,它安装在Studio2.2模拟器中。 问题是这些模拟器使用的是旧版本的Play Services。 当我运行一个使用Firebase来促进Google登录的测试应用程序时,我从Nexus 5 API 23模拟器中得到以下警报对话框: