Получение 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));
}
}
}
Ответы
Ответ 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());