Получение Robolectric для работы с Volley - программирование
Подтвердить что ты не робот

Получение Robolectric для работы с Volley

Я пытаюсь заставить Volley работать с Robolectric. Я вижу, что мой HTTP-запрос получает вызов, и вызывается parseNetworkResponse (я отправляю пользовательский подкласс JsonRequest), но мой прослушиватель НЕ получает вызов. Любой совет? Вот пример кода:

@Test
public void testTypeAheadClient() throws Exception {
    Robolectric.getFakeHttpLayer().interceptHttpRequests(false);
    //mRemoteRequestQueue and mCustomRequest are set up previously
    mRemoteRequestQueue.add(mCustomRequest);
}

private static class CustomRequest extends JsonRequest<MyObject> {
    public CustomRequest(String url,
                         Response.Listener<MyObject> listener,
                         Response.ErrorListener errorListener) {
        super(Request.Method.GET, url, null, listener, errorListener);
    }

    @Override
    protected Response<MyObject> parseNetworkResponse(NetworkResponse response) {
        System.out.println("in parseNetworkResponse");
        try {
            MyObject myObject = new MyObject(new JSONArray(new String(response.data, "UTF-8")));
            return Response.success(myObject, HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            e.printStackTrace();
            return Response.error(new ParseError(e));
        }
    }
}
4b9b3361

Ответ 1

Я решил эту же проблему, заменив RequestQueue ResponseDelivery тем, у кого не используется Looper.getMainLooper(), а новый Executor. Пример кода:

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;
}

Примечание: используйте Robolectric-2.2-SNAPSHOT, предыдущая версия не очень хорошо работает с Volley.

Надеюсь, что это поможет

Ответ 2

Вдохновленный @Thomas Moerman ответом, я создал этот класс:

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;
        }
    }
}

Затем я заглядываю в очередь запросов и вставляю их в тестируемую систему

mQueue = spy(RealRequestQueue.newBuilder().network(mNetwork).build());