package com.android.volley; import com.android.volley.mock.ShadowSystemClock; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowSystemClock.class}) public class SyncDispatcherTest { @Mock private Network mockNetwork; @Mock private Cache cache; @Mock private Cache.Entry cacheEntry; @Mock private Request request; private SyncDispatcher dispatcher; @Before public void setUp() throws Exception { initMocks(this); dispatcher = new SyncDispatcher(cache, mockNetwork); Response response = Response.success(null, cacheEntry); when(cache.get(anyString())).thenReturn(cacheEntry); when(request.parseNetworkResponse(any(NetworkResponse.class))).thenReturn(response); when(request.getCacheKey()).thenReturn("test-cache-key"); } @Test public void testCacheAccess() { dispatcher.processRequest(request); verify(cache).get("test-cache-key"); } @Test public void testNetworkAccess() throws VolleyError { when(cacheEntry.isExpired()).thenReturn(true); dispatcher.processRequest(request); verify(mockNetwork).performRequest(request); } @Test public void testCachePut() throws VolleyError { //Given when(cacheEntry.isExpired()).thenReturn(true); //mock non expired entry for return Cache.Entry networkEntry = new Cache.Entry(); networkEntry.ttl = System.currentTimeMillis() + 100000; NetworkResponse networkResponse = mock(NetworkResponse.class); when(mockNetwork.performRequest(any(Request.class))).thenReturn(networkResponse); Response response = Response.success(new Object(), networkEntry); when(request.parseNetworkResponse(any(NetworkResponse.class))).thenReturn(response); request.setShouldCache(true); //When dispatcher.processRequest(request); //Then verify(cache).put("test-cache-key", networkEntry); } @Test public void testRequestNoCache() throws VolleyError { when(cacheEntry.isExpired()).thenReturn(true); //mock non expired entry for return Cache.Entry networkEntry = mock(Cache.Entry.class); when(networkEntry.isExpired()).thenReturn(false); Response response = Response.success(null, networkEntry); when(request.parseNetworkResponse(any(NetworkResponse.class))).thenReturn(response); dispatcher.processRequest(request); verify(cache, never()).put("test-cache-key", networkEntry); verify(mockNetwork).performRequest(request); } @Test public void testCachePutExpired() throws VolleyError { when(cacheEntry.isExpired()).thenReturn(true); //mock non expired entry for return Cache.Entry networkEntry = mock(Cache.Entry.class); when(networkEntry.isExpired()).thenReturn(true); Response response = Response.success(null, networkEntry); when(request.parseNetworkResponse(any(NetworkResponse.class))).thenReturn(response); dispatcher.processRequest(request); verify(cache, never()).put("test-cache-key", networkEntry); } @Test public void testCacheEntryNull() throws VolleyError { when(cache.get(anyString())).thenReturn(null); dispatcher.processRequest(request); verify(mockNetwork).performRequest(request); } @Test public void testRefresh() throws VolleyError { when(cacheEntry.isExpired()).thenReturn(false); when(cacheEntry.refreshNeeded()).thenReturn(true); //mock non expired entry for return Cache.Entry networkEntry = mock(Cache.Entry.class); when(networkEntry.isExpired()).thenReturn(false); Response response = Response.success(null, networkEntry); when(request.parseNetworkResponse(any(NetworkResponse.class))).thenReturn(response); request.setShouldCache(true); dispatcher.processRequest(request); verify(cache).put("test-cache-key", networkEntry); verify(mockNetwork).performRequest(request); } }