我正在编写在UI中执行操作的集成测试,这些操作使用Retrofit启动网络调用。
我知道我需要实现一个CountingIdlingResource,但我想以正确的方式来实现它(如果已经完成了,就不要重新发明轮子)。
是否有人在应用程序的Espresso测试套件中实现了一个,以等待网络请求的执行?
更多信息,这里。
发布于 2014-05-03 22:26:39
最简单的解决方案是:基本上将Retrofit的线程池执行器替换为AsyncTask 1(这是链接谷歌小组讨论中非常有用的尼克推荐的)。我是这样做的:
new RestAdapter.Builder()
.setEndpoint(LOCLSET_SERVER_URL)
.setExecutors(AsyncTask.THREAD_POOL_EXECUTOR,
new MainThreadExecutor())
.build();我不确定这是否是最合适的解决方案,但这是我能找到的最快速、最理智的解决方案。请记住,这只适用于ICS+。
发布于 2016-04-28 20:23:50
如果您在Retroeft2.0中使用的是RxJava可观测值,那么您可以使用.subscribeOn(Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))而不是.subscribeOn(Schedulers.io()),一切都很好!
或者,您也可以重写RxJavaSchedulersHook,允许您只在一个位置进行更改。例如:
public MySuperCoolClient() {
if (BuildConfig.DEBUG) {
configureIoSchedulerToUseAsyncTaskThreadPool();
}
this.restApi = new Retrofit.Builder()
.baseUrl(Parameters.endpoint)
.addConverterFactory(GsonConverterFactory.create(gsonBuilder()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
.create(RestApi.class);
}
private void configureIoSchedulerToUseAsyncTaskThreadPool() {
RxJavaPlugins.getInstance().registerSchedulersHook(new RxJavaSchedulersHook() {
@Override
public Scheduler getIOScheduler() {
return Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR);
}
});
}发布于 2015-02-25 18:36:17
注下面的答案是基于Retrofit 1.6.1 -将更新为最新版本。改造1.9.0不再允许您通过HttpExecutor设置RestAdapter.Builder
接受的答案是朝着正确方向迈出的一步,但它使我感到不舒服。实际上,您要么需要为Live&TestsBuilds设置AsyncTask.THREAD_POOL_EXECUTOR,要么只需要设置测试构建。
设置两者都意味着所有的网络IO池都将依赖于aysnc队列实现,该实现变成了默认情况下,目标版本为ICS+的应用程序是串行的。
设置测试只意味着您的测试构建与实际构建不同,而imho并不是开始测试的好地方。此外,由于异步池的更改,您可能会在旧设备上遇到测试问题。
上面正确地提到,Espresso已经连接到AsyncTask.THREAD_POOL_EXECUTOR了。让我们四处打听..。
它是怎么得到这个的?
谁/什么用这个?
BaseLayerModule有一个返回AsyncTaskPoolMonitor的provideCompatAsyncTaskMonitor(ThreadPoolExecutorExtractor extractor)
这是如何工作的呢?看一看!
它在哪用的?
UiControllerImpl有方法loopMainThreadUntilIdle(),在使用idlingResourceRegistry.allResourcesAreIdle()检查任何注册的idlingResources之前,它会手动调用asyncTaskMonitor.isIdleNow()。
我想,在Retrofit中,我们可以使用RestAdapter.Builder.setExecutors(...)方法,并使用Retrofit在Android上的相同的http Executor传递自己的AsyncTaskPoolMonitor实例(或版本)。
@Override Executor defaultHttpExecutor() {
return Executors.newCachedThreadPool(new ThreadFactory() {
@Override public Thread newThread(final Runnable r) {
return new Thread(new Runnable() {
@Override public void run() {
Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND);
r.run();
}
}, RestAdapter.IDLE_THREAD_NAME);
}
});
}(来自这里)
并将其封装在IdlingResource接口中,用于我们的测试!!
唯一的问题是,在Retrofit使用依赖于主活套的mainThread上的单独Executor进行回调时,这可能会导致问题,但我假设Espresso目前也与此有关。需要调查一下这个。
https://stackoverflow.com/questions/23142437
复制相似问题