2013-05-29 15 views
14

Próbuję zmusić Volley do pracy z Robolectric. Widzę, że moje żądanie HTTP jest wywoływane i wywoływana jest funkcja parseNetworkResponse (wysyłam niestandardową podklasę JsonRequest), ale mój odbiornik NIE jest wywoływany. Jakakolwiek rada? Oto przykładowy kod:Uzyskiwanie Robolectric do pracy z Volley

@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

Podczas korzystania z oddzwonienia, przypuszczam, że jest to biblioteka asynchroniczna. Aby użyć Robolectric z Android Async Http lib, musisz ustawić własną pulę wątków. Może w tym przypadku można przyjąć to samo rozwiązanie. https://groups.google.com/forum/#!msg/robolectric/Z3Yg04gL4hg/iwYlnvHAkO4J – Axxiss

+0

Jeśli to wszystko działa, czy możesz opublikować cały testowy kod? –

Odpowiedz

19

I rozwiązać ten sam problem zastępując RequestQueue za ResponseDelivery z takim, który nie korzysta z Looper.getMainLooper(), ale nowy Executor. Przykładowy kod:

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

Uwaga: Należy używać Robolectric-2,2-SNAPSHOT, poprzednia wersja nie dobrze bawić Volley.

Nadzieja to pomaga

+0

działało to doskonale, ponieważ pozwalało na wykonywanie wywołań zwrotnych ... jednak teraz generuje przerażające "Stub!" wyjątek w tym wierszu: 'at org.apache.http.ProtocolVersion. (ProtocolVersion.java:5) ', która jest wywoływana z:' com.android.volley.toolbox.HurlStack.performRequest (HurlStack.java:108) '' at com.android.volley.toolbox.BasicNetwork.performRequest (BasicNetwork. java: 93) '' at com.android.volley.NetworkDispatcher.run (NetworkDispatcher.java:105) ' – gMale

+1

Jeśli otrzymasz wyjątek skrótowy ProtocolVersion, oznacza to, że musisz przenieść robolectric wyżej w ścieżce kompilacji/pom.xml . – Gabriel

+0

TAK - to było właśnie to, czego potrzebowałem. Aby zapakować rzeczy w ładną paczkę, możesz ustawić fajną małą klasę siatkówki i zacząć ją w ten sposób: volley = new Volley (RuntimeEnvironment.application, new ExecutorDelivery (Executors.newSingleThreadExecutor())); – slott

0

Zainspirowany odpowiedź @Thomas MOERMAN użytkownika, stworzyłem tę klasę:

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

Potem szpiegować kolejce żądanie i wstrzyknąć go do systemu badanego

mQueue = spy(RealRequestQueue.newBuilder().network(mNetwork).build()); 
Powiązane problemy