2013-05-29 7 views
14

J'essaie de faire fonctionner Volley avec Robolectric. Je peux voir que ma requête HTTP est appelée, et que parseNetworkResponse est appelée (j'envoie une sous-classe personnalisée de JsonRequest), mais mon Listener N'EST PAS appelé. Aucun conseil? Voici un exemple de code:Obtenir Robolectric pour travailler avec 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

Comme vous utilisez le rappel, je suppose que c'est une bibliothèque asynchrone. Pour utiliser Robolectric avec Android Async Http lib, vous devez définir votre propre pool de threads. Peut-être que dans ce cas la même solution peut être adoptée. https://groups.google.com/forum/#!msg/robolectric/Z3Yg04gL4hg/iwYlnvHAkO4J – Axxiss

+0

Si cela vous arrivait, pourriez-vous poster tout votre code de test? –

Répondre

19

Je résolus même problème en remplaçant ResponseDelivery du RequestQueue avec celui qui n'utilise pas le Looper.getMainLooper() mais une nouvelle Executor. Exemple de 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: utiliser Robolectric-2.2-SNAPSHOT, la version précédente ne joue pas bien avec Volley.

Hope this helps

+0

cela a fonctionné parfaitement, en ce qu'il a permis aux callbacks de s'exécuter ... cependant, il génère maintenant le "Stub!" Redouté! exception sur cette ligne: 'à org.apache.http.ProtocolVersion. (ProtocolVersion.java:5) 'qui est appelée depuis:' com.android.volley.toolbox.HurlStack.performRequest (HurlStack.java:108) '' sur com.android.volley.toolbox.BasicNetwork.performRequest (BasicNetwork. java: 93) '' at. com.android.volley.NetworkDispatcher.run (NetworkDispatcher.java:105) ' – gMale

+1

Si vous obtenez l'exception stub ProtocolVersion cela signifie que vous devez déplacer robolectric plus haut dans votre chemin de construction/pom.xml . – Gabriel

+0

OUI - c'était exactement ce dont j'avais besoin. Donc, pour envelopper les choses dans un joli paquet, vous pouvez configurer une belle petite classe de volley et commencer comme ça volley = new Volley (RuntimeEnvironment.application, nouveau ExecutorDelivery (Executors.newSingleThreadExecutor())); – slott

0

Inspiré par la réponse de @Thomas Moerman, j'ai créé cette classe:

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

Je vois alors sur la file d'attente de la demande et l'injecter dans le système testé

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