Robol

2013-05-29 12 views
14

ile çalışmak için Robolectric'i alıyorum Volley, Robolectric ile çalışmaya çalışıyorum. HTTP isteğimin çağrıldığını ve parseNetworkResponse'nin çağrıldığını görebiliyorum (JsonRequest'in özel bir alt sınıfını gönderiyorum), ancak Dinleyici'üm aranmıyor. Herhangi bir tavsiye? İşte bir kod örneği geçerli:Robol

@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

Geri arama özelliğini kullandığından, bunun bir uyumsuz kütüphanesi olduğunu varsayalım. Android Async Http lib ile Robolectric kullanmak için kendi thread havuzunuzu ayarlamanız gerekir. Belki bu durumda aynı çözüm benimsenebilir. https://groups.google.com/forum/#!msg/robolectric/Z3Yg04gL4hg/iwYlnvHAkO4J – Axxiss

+0

Eğer bunu işe aldıysanız, tüm test kodunuzu gönderebilir misiniz? –

cevap

19

Ben Looper.getMainLooper() ama yeni bir Executor kullanmaz biriyle RequestQueue en ResponseDelivery değiştirerek aynı sorunu çözdü. Örnek 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; 
} 

Not: Robolectric-2.2-SNAPSHOT kullanın önceki sürümü Volley iyi oynamıyor.

Umut bu @Thomas MOERMAN cevabı esinlenerek

+0

, bu mükemmel bir şekilde çalıştı, çünkü geri çağrıların yürütülmesine izin verdi ... ancak, şimdi korkutucu "Saplama!" Bu satırdaki istisna: 'org.apache.http.ProtocolVersion'da. (ProtocolVersion.java:5) 'den denir: com.android.volley.toolbox.HurlStack.performRequest (HurlStack.java:108)' com.android.volley.toolbox adresinde.BasicNetwork.performRequest (BasicNetwork. java: 93) 'com.android.volley.NetworkDispatcher.run (NetworkDispatcher.java:105)' – gMale

+1

ProtokolVersion saplama istisnasını alırsanız, robolectric'i yapı yolunuzda daha yükseğe taşımanız gerektiği anlamına gelir. . – Gabriel

+0

EVET - bu sadece ihtiyacım olan şeydi. Bu yüzden, güzel bir paket içinde bir şeyler sarmak için güzel bir voleybol sınıfı kurabilir ve bu gibi başlatabilirsiniz: volley = new Volley (RuntimeEnvironment.application, yeni ExecutorDelivery (Executors.newSingleThreadExecutor())); – slott

0

yardımcı olur, ben bu sınıfı oluşturuldu:

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

Sonra istek kuyruğunda casusluk ve test edilen sisteme enjekte

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