Getting Robolectric to work with Volley

血红的双手。 提交于 2019-12-03 02:00:50

I solved that same problem by replacing the RequestQueue's ResponseDelivery with one that doesn't use the Looper.getMainLooper() but a new Executor. Example code:

public static RequestQueue newRequestQueueForTest(final Context context, final OkHttpClient okHttpClient) {
    final File cacheDir = new File(context.getCacheDir(), "volley");

    final Network network = new BasicNetwork(new OkHttpStack(okHttpClient));

    final ResponseDelivery responseDelivery = new ExecutorDelivery(Executors.newSingleThreadExecutor());

    final RequestQueue queue =
            new RequestQueue(
                    new DiskBasedCache(cacheDir),
                    network,
                    4,
                    responseDelivery);

    queue.start();

    return queue;
}

Note: use Robolectric-2.2-SNAPSHOT, the previous version doesn't play well with Volley.

Hope this helps

Inspired by @Thomas Moerman's answer, I created this class:

public class RealRequestQueue {

    public static Builder newBuilder() {
        return new Builder();
    }

    public static final class Builder {
        private Cache mCache;
        private Network mNetwork;

        private Builder() {
        }

        public Builder cache(Cache val) {
            mCache = val;
            return this;
        }

        public Builder network(Network val) {
            mNetwork = val;
            return this;
        }

        public RequestQueue build() {
            if (mNetwork == null) mNetwork = new BasicNetwork(new HttpStack() {
                @Override public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) throws IOException, AuthFailureError {
                    return null;
                }
            });
            if (mCache == null) {
                Context context = RuntimeEnvironment.application.getApplicationContext();
                mCache = new DiskBasedCache(new File(context.getCacheDir(), "volley"));
            }

            ResponseDelivery responseDelivery = new ExecutorDelivery(Executors.newSingleThreadExecutor());
            final RequestQueue queue = new RequestQueue(mCache, mNetwork, 4, responseDelivery);

            return queue;
        }
    }
}

I then spy on the request queue and inject it in to the system under test

mQueue = spy(RealRequestQueue.newBuilder().network(mNetwork).build());
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!