NetworkDispatcher extends Thread { private void processRequest() throws InterruptedException { Request<?> request = mQueue.take(); processRequest(request); } NetworkDispatcher(
            BlockingQueue<Request<?>> queue,
            Network network,
            Cache cache,
            ResponseDelivery delivery); void quit(); @Override void run();  }
@Test public void successPostsResponse() throws Exception { when(mNetwork.performRequest(any(Request.class))) .thenReturn(new NetworkResponse(CANNED_DATA)); mDispatcher.processRequest(mRequest); ArgumentCaptor<Response> response = ArgumentCaptor.forClass(Response.class); verify(mDelivery).postResponse(any(Request.class), response.capture()); assertTrue(response.getValue().isSuccess()); assertEquals(response.getValue().result, new String(CANNED_DATA, StandardCharsets.UTF_8)); verify(mDelivery, never()).postError(any(Request.class), any(VolleyError.class)); }
@Test public void successNotifiesListener() throws Exception { RequestQueue.RequestEventListener listener = mock(RequestQueue.RequestEventListener.class); RequestQueue queue = new RequestQueue(new NoCache(), mNetwork, 0, mDelivery); queue.addRequestEventListener(listener); mRequest.setRequestQueue(queue); when(mNetwork.performRequest(any(Request.class))) .thenReturn(new NetworkResponse(CANNED_DATA)); mDispatcher.processRequest(mRequest); InOrder inOrder = inOrder(listener); inOrder.verify(listener) .onRequestEvent( mRequest, RequestQueue.RequestEvent.REQUEST_NETWORK_DISPATCH_STARTED); inOrder.verify(listener) .onRequestEvent( mRequest, RequestQueue.RequestEvent.REQUEST_NETWORK_DISPATCH_FINISHED); inOrder.verifyNoMoreInteractions(); }
@Test public void exceptionPostsError() throws Exception { when(mNetwork.performRequest(any(Request.class))).thenThrow(new ServerError()); mDispatcher.processRequest(mRequest); verify(mDelivery).postError(any(Request.class), any(VolleyError.class)); verify(mDelivery, never()).postResponse(any(Request.class), any(Response.class)); }
@Test public void exceptionNotifiesListener() throws Exception { RequestQueue.RequestEventListener listener = mock(RequestQueue.RequestEventListener.class); RequestQueue queue = new RequestQueue(new NoCache(), mNetwork, 0, mDelivery); queue.addRequestEventListener(listener); mRequest.setRequestQueue(queue); when(mNetwork.performRequest(any(Request.class))).thenThrow(new ServerError()); mDispatcher.processRequest(mRequest); InOrder inOrder = inOrder(listener); inOrder.verify(listener) .onRequestEvent( mRequest, RequestQueue.RequestEvent.REQUEST_NETWORK_DISPATCH_STARTED); inOrder.verify(listener) .onRequestEvent( mRequest, RequestQueue.RequestEvent.REQUEST_NETWORK_DISPATCH_FINISHED); inOrder.verifyNoMoreInteractions(); }
@Test public void shouldCacheFalse() throws Exception { mRequest.setShouldCache(false); mDispatcher.processRequest(mRequest); verify(mCache, never()).put(anyString(), any(Cache.Entry.class)); }
@Test public void shouldCacheTrue() throws Exception { when(mNetwork.performRequest(any(Request.class))) .thenReturn(new NetworkResponse(CANNED_DATA)); mRequest.setShouldCache(true); mDispatcher.processRequest(mRequest); ArgumentCaptor<Cache.Entry> entry = ArgumentCaptor.forClass(Cache.Entry.class); verify(mCache).put(eq(mRequest.getCacheKey()), entry.capture()); assertTrue(Arrays.equals(entry.getValue().data, CANNED_DATA)); }