AbstractCache implements IDataCache<T> { @Override public T loadData(long id) { T entry = getData(id, true); if (entry == null) { entry = cachedStorage.loadData(id); if (entry == null) { return null; } cacheData(entry); } return entry; } AbstractCache(S entries, IDataStorage<T> cachedStorage, long maxCacheSize,
      Predicate<T> cachingRule); @Override long getMaxCacheSize(); @Override boolean setMaxCacheSize(long maxCacheSize); @Override long getCurrentCacheSize(); @Override long getFreeSpace(); @Override boolean hasStorageFor(long size); @Override void cacheData(T data); @Override void uncacheData(T data); @Override boolean dataIsCachable(T data); @Override boolean dataIsInCache(long id); @Override void clearCache(); @Override boolean dataExists(long id); @Override T loadData(long id); @Override boolean saveData(T data); @Override boolean dataIsStorable(T data); @Override boolean deleteData(T data);  }
@Test public void testLoadData() { AbstractCacheWrapper uut = new AbstractCacheWrapper(entries, null, 20000, predicate -> true); uut.cacheData(c0); uut.cacheData(c2); assertEquals(c0, uut.loadData(c0.getId())); assertEquals(null, uut.loadData(c1.getId())); assertEquals(c2, uut.loadData(c2.getId())); assertEquals(null, uut.loadData(c3.getId())); entries.clear(); uut = new AbstractCacheWrapper(entries, storageAll, 20000, predicate -> true); assertEquals(c0, uut.loadData(c0.getId())); assertEquals(c1, uut.loadData(c1.getId())); assertEquals(c2, uut.loadData(c2.getId())); assertEquals(c3, uut.loadData(c3.getId())); }