2013-05-29 24 views
14

Tôi đang cố gắng để có được Volley làm việc với Robolectric. Tôi có thể thấy rằng yêu cầu HTTP của tôi đang được gọi và parseNetworkResponse đang được gọi (tôi đang gửi một lớp con tùy chỉnh của JsonRequest), nhưng Trình nghe của tôi KHÔNG được gọi. Lời khuyên nào? Đây là một mẫu mã:Bắt Robolectric để làm việc với 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

Khi bạn đang sử dụng gọi lại, tôi cho rằng đó là một thư viện không đồng bộ. Để sử dụng Robolectric với Android Async Http lib, bạn cần thiết lập nhóm chủ đề của riêng mình. Có lẽ trong trường hợp này, cùng một giải pháp có thể được áp dụng. https://groups.google.com/forum/#!msg/robolectric/Z3Yg04gL4hg/iwYlnvHAkO4J – Axxiss

+0

Nếu bạn làm việc này, bạn có thể đăng toàn bộ mã thử nghiệm của mình không? –

Trả lời

19

tôi giải quyết rằng cùng một vấn đề bằng cách thay thế ResponseDelivery của RequestQueue với một mà không sử dụng các Looper.getMainLooper() nhưng một Executor mới. Mã ví dụ:

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

Lưu ý: sử dụng Robolectric-2.2-SNAPSHOT, phiên bản trước không hoạt động tốt với Volley.

Hope this helps

+0

điều này làm việc hoàn hảo, trong đó nó cho phép các callbacks để thực hiện ... tuy nhiên, nó bây giờ tạo ra các "Stub!" Sợ hãi ngoại lệ trên dòng này: 'at org.apache.http.ProtocolVersion. (ProtocolVersion.java Wealth) 'được gọi từ:' com.android.volley.toolbox.HurlStack.performRequest (HurlStack.java:108) '' tại com.android.volley.toolbox.BasicNetwork.performRequest (BasicNetwork. java: 93) '' tại com.android.volley.NetworkDispatcher.run (NetworkDispatcher.java:105) ' – gMale

+1

Nếu bạn nhận được ngoại lệ stub ProtocolVersion, nó có nghĩa là bạn cần phải di chuyển robolectric lên cao hơn trong đường dẫn xây dựng của bạn/pom.xml . – Gabriel

+0

CÓ - đây chỉ là những gì tôi cần. Vì vậy, để kết thúc mọi thứ trong một gói tốt đẹp, bạn có thể thiết lập một lớp học bóng chuyền nhỏ và bắt đầu nó như thế này volley = new Volley (RuntimeEnvironment.application, new ExecutorDelivery (Executors.newSingleThreadExecutor())); – slott

0

Lấy cảm hứng từ câu trả lời @Thomas Moerman, tôi tạo ra lớp này:

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

sau đó tôi do thám hàng đợi yêu cầu và tiêm nó vào hệ thống được kiểm tra

mQueue = spy(RealRequestQueue.newBuilder().network(mNetwork).build()); 
Các vấn đề liên quan