CachedGrabber implements GrabberIF<O, G>, CachedIF { public CachedGrabber(GrabberIF<O, G> grabber) { this.grabber = grabber; } CachedGrabber(GrabberIF<O, G> grabber); GrabberIF<O, G> getGrabber(); void setGrabber(GrabberIF<O, G> grabber); @Override G grab(O object); @Override void refresh();  }
@Test public void testCachedGrabber() { CachedGrabber grb = new CachedGrabber(new SubstringGrabber(5, 15)); String str = "Jazz is not dead, it just smells funny!"; testGrabber(grb.grab(str), grb.getGrabber().grab(str), grb.getGrabber().grab(str.substring(2))); str.replace(' ', '-'); testGrabber(grb.grab(str), grb.getGrabber().grab(str), grb.getGrabber().grab(str.substring(2))); testGrabber(grb.grab(str), grb.getGrabber().grab(str), grb.getGrabber().grab(str.substring(2))); grb.refresh(); testGrabber(grb.grab(str), grb.getGrabber().grab(str), grb.getGrabber().grab(str.substring(2))); str.replace('-', '_'); testGrabber(grb.grab(str), grb.getGrabber().grab(str), grb.getGrabber().grab(str.substring(2))); testGrabber(grb.grab(str), grb.getGrabber().grab(str), grb.getGrabber().grab(str.substring(2))); grb.setGrabber(new UpperCaseGrabber()); testGrabber(grb.grab(str), grb.grab(str), grb.getGrabber().grab(str)); grb.refresh(); testGrabber(grb.grab(str), grb.getGrabber().grab(str), grb.getGrabber().grab(str.substring(2))); }