2013-05-29 11 views
14

के साथ काम करने के लिए रोबोलेक्ट्रिक प्राप्त करना मैं वॉली को रोबोलेक्ट्रिक के साथ काम करने की कोशिश कर रहा हूं। मैं देख सकता हूं कि मेरा 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

जैसा कि आप कॉलबैक का उपयोग कर रहे हैं, मुझे लगता है कि यह एक async लाइब्रेरी है। Android Async Http lib के साथ Robolectric का उपयोग करने के लिए आपको अपना खुद का थ्रेड पूल सेट करने की आवश्यकता है। शायद इस मामले में एक ही समाधान अपनाया जा सकता है। https://groups.google.com/forum/#!msg/robolectric/Z3Yg04gL4hg/iwYlnvHAkO4J – Axxiss

+0

यदि आपको यह काम करने के लिए मिला तो क्या आप अपना पूरा टेस्ट कोड पोस्ट कर सकते हैं? –

उत्तर

19

मैं एक है कि Looper.getMainLooper() लेकिन एक नए निर्वाहक उपयोग नहीं करता है के साथ RequestQueue के ResponseDelivery की जगह है कि एक ही समस्या हल हो। उदाहरण कोड:

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-स्नैपशॉट, पिछले संस्करण वॉली के साथ अच्छी तरह से नहीं चलता है।

आशा इस मदद करता है

+0

यह पूरी तरह से काम करता है, जिसमें कॉलबैक निष्पादित करने की अनुमति है ... हालांकि, अब यह डरावना "स्टब!" उत्पन्न करता है इस लाइन पर अपवाद: 'org.apache.http.ProtocolVersion पर। (प्रोटोकॉलवर्सन.जावाट) 'जिसे से कहा जाता है:' com.android.volley.toolbox.HurlStack.performRequest (HurlStack.java:108) 'com.android.volley.toolbox.BasicNetwork.performRequest (BasicNetwork। जावा: 9 3) 'com.android.volley.NetworkDispatcher.run (NetworkDispatcher.java:105)' – gMale

+1

यदि आपको प्रोटोकॉल वर्जन स्टब अपवाद मिलता है तो इसका मतलब है कि आपको अपने बिल्ड पथ/pom.xml में robolectric को ऊपर ले जाने की आवश्यकता है । – Gabriel

+0

हाँ - यह वही था जो मुझे चाहिए था। तो चीजों को एक अच्छे पैकेज में लपेटने के लिए आप एक अच्छी छोटी वॉली क्लास सेट कर सकते हैं और इसे वॉली = नई वॉली (रनटाइम एनवायरमेंट.एप्लिकेशंस, नई एक्जिक्यूटोर डिलीवरी (एक्जिक्यूटर्स.न्यू सिंगल थ्रेडएक्सएटर())); – slott

0

@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()); 
संबंधित मुद्दे