我正在为我们的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
来测试它)