MockRetrofit和BehaviorDelegate忽略OkHttpClient

时间:2017-05-13 12:17:50

标签: android unit-testing mocking retrofit2 okhttp3

我正在为我们的MBaaS服务编写SDK。我使用Retrofit2进行REST调用。

我有一个拦截器(非常类似于this)用于刷新过期令牌,该令牌执行非常复杂的if-else案例。为了测试拦截器,我需要使用MockRetrofit库来模拟我的API。到现在为止还挺好! (有关我的拦截器类的一些信息,请参阅问题的结尾)

以下是代码:

@Before
public void setup() {
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BacktoryClient.BASE_URL)
        .client(new OkHttpClient.Builder().addInterceptor(new RetryWithRefreshedTokenInterceptor()).build())
        .build();

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

    delegate = mockRetrofit.create(AuthApiDefinition.class);
}

@Test
public void testRetryWithRefreshedToken() throws Exception {
    SimpleMock apiMock = new SimpleMock(delegate);
    Response<SomeApiResponse> response = apiMock.someApiCall(<parameters>).execute();
    // assert part
}

问题是测试方法中的response对象应该是什么(指示模拟部分没问题)但是没有调用RetryWithRefreshedTokenInterceptor拦截器。所以我假设MockRetrofit忽略了OkHttpClient

现在问真正的问题,这是某种错误还是我完全误解了MockRetrofit库的用法?如果是你,你是如何测试拦截器的?

有关RetryWithRefreshedTokenInterceptor的更多信息:它检查响应代码是否为401,如果是,则调用我们的SDK的方法,该方法本身调用我们的API方法(此处来自模拟的API)以获取新令牌并保存在持久存储中(在拦截器中使用的API方法中处理的逻辑量足够大,我无法隔离拦截器以使用MockWebserver来测试它)

0 个答案:

没有答案