2013-05-29 30 views
14

我想讓Volley和Robolectric一起工作。我可以看到我的HTTP請求被調用,parseNetworkResponse被調用(我發送了JsonRequest的自定義子類),但是我的Listener沒有被調用。有什麼建議?下面是一個代碼示例:讓Robolectric和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

正如你使用回調,我想這是一個異步庫。要在Android Async Http庫中使用Robolectric,您需要設置您自己的線程池。也許在這種情況下,可以採用相同的解決方案。 https://groups.google.com/forum/#!msg/robolectric/Z3Yg04gL4hg/iwYlnvHAkO4J – Axxiss

+0

如果你有這個工作,你可以發佈你的整個測試代碼? –

回答

19

我用一個不使用Looper.getMainLooper(),但一個新的執行官更換請求隊列的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-SNAPSHOT,以前的版本不排球打得好。

希望這有助於

+0

這個工作完美,因爲它允許回調執行...但是,它現在生成可怕的「存根」!這條線上的例外:'at org.apache.http.ProtocolVersion。 (基本網絡)中調用:'com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:108)'' java:93)''at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)' – gMale

+1

如果你得到了ProtocolVersion存根異常,這意味着你需要在你的構建路徑/ pom.xml中更高地移動robolectric 。 – Gabriel

+0

是 - 這正是我所需要的。因此,把東西包裝在一個漂亮的包中,你可以設置一個不錯的小排球,並像這樣啓動它 volley = new Volley(RuntimeEnvironment.application,new ExecutorDelivery(Executors.newSingleThreadExecutor())); – 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());