首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用重装网络请求时使用IdlingResource测试Android

如何在使用重装网络请求时使用IdlingResource测试Android
EN

Stack Overflow用户
提问于 2014-04-17 20:03:24
回答 5查看 5.6K关注 0票数 18

我正在编写在UI中执行操作的集成测试,这些操作使用Retrofit启动网络调用。

我知道我需要实现一个CountingIdlingResource,但我想以正确的方式来实现它(如果已经完成了,就不要重新发明轮子)。

是否有人在应用程序的Espresso测试套件中实现了一个,以等待网络请求的执行?

更多信息,这里

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-03 22:26:39

最简单的解决方案是:基本上将Retrofit的线程池执行器替换为AsyncTask 1(这是链接谷歌小组讨论中非常有用的尼克推荐的)。我是这样做的:

代码语言:javascript
复制
new RestAdapter.Builder()
               .setEndpoint(LOCLSET_SERVER_URL)
               .setExecutors(AsyncTask.THREAD_POOL_EXECUTOR,
                             new MainThreadExecutor())
               .build();

我不确定这是否是最合适的解决方案,但这是我能找到的最快速、最理智的解决方案。请记住,这只适用于ICS+。

票数 22
EN

Stack Overflow用户

发布于 2016-04-28 20:23:50

如果您在Retroeft2.0中使用的是RxJava可观测值,那么您可以使用.subscribeOn(Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))而不是.subscribeOn(Schedulers.io()),一切都很好!

或者,您也可以重写RxJavaSchedulersHook,允许您只在一个位置进行更改。例如:

代码语言:javascript
复制
   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);
         }
      });
   }
票数 4
EN

Stack Overflow用户

发布于 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了。让我们四处打听..。

它是怎么得到这个的?

ThreadPoolExecutorExtractor

谁/什么用这个?

BaseLayerModule有一个返回AsyncTaskPoolMonitorprovideCompatAsyncTaskMonitor(ThreadPoolExecutorExtractor extractor)

这是如何工作的呢?看一看!

AsyncTaskPoolMonitor

它在哪用的?

UiControllerImpl有方法loopMainThreadUntilIdle(),在使用idlingResourceRegistry.allResourcesAreIdle()检查任何注册的idlingResources之前,它会手动调用asyncTaskMonitor.isIdleNow()

我想,在Retrofit中,我们可以使用RestAdapter.Builder.setExecutors(...)方法,并使用Retrofit在Android上的相同的http Executor传递自己的AsyncTaskPoolMonitor实例(或版本)。

代码语言:javascript
复制
@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目前也与此有关。需要调查一下这个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23142437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档