@Test public void testOnlyCallComputableOnceIfDoesNotThrowException() throws Exception { final Integer input = 1; final Memoizer<Integer, Integer> memoizer = new Memoizer<>(computable); expect(computable.compute(input)).andReturn(input); replay(computable); assertEquals("Should call computable first time", input, memoizer.compute(input)); assertEquals("Should not call the computable the second time", input, memoizer.compute(input)); }
@Test(expected = IllegalStateException.class) public void testDefaultBehaviourNotToRecalculateExecutionExceptions() throws Exception { final Integer input = 1; final Memoizer<Integer, Integer> memoizer = new Memoizer<>(computable); final InterruptedException interruptedException = new InterruptedException(); expect(computable.compute(input)).andThrow(interruptedException); replay(computable); try { memoizer.compute(input); fail("Expected Throwable to be thrown!"); } catch (final Throwable expected) { // Should always be thrown the first time } memoizer.compute(input); }
@Test(expected = RuntimeException.class) public void testWhenComputableThrowsRuntimeException() throws Exception { final Integer input = 1; final Memoizer<Integer, Integer> memoizer = new Memoizer<>(computable); final RuntimeException runtimeException = new RuntimeException("Some runtime exception"); expect(computable.compute(input)).andThrow(runtimeException); replay(computable); memoizer.compute(input); }
@Test(expected = IllegalStateException.class) public void testDoesNotRecalculateWhenSetToFalse() throws Exception { final Integer input = 1; final Memoizer<Integer, Integer> memoizer = new Memoizer<>(computable, false); final InterruptedException interruptedException = new InterruptedException(); expect(computable.compute(input)).andThrow(interruptedException); replay(computable); try { memoizer.compute(input); fail("Expected Throwable to be thrown!"); } catch (final Throwable expected) { // Should always be thrown the first time } memoizer.compute(input); }
@Test(expected = Error.class) public void testWhenComputableThrowsError() throws Exception { final Integer input = 1; final Memoizer<Integer, Integer> memoizer = new Memoizer<>(computable); final Error error = new Error(); expect(computable.compute(input)).andThrow(error); replay(computable); memoizer.compute(input); } }
@Test public void testDoesRecalculateWhenSetToTrue() throws Exception { final Integer input = 1; final Integer answer = 3; final Memoizer<Integer, Integer> memoizer = new Memoizer<>(computable, true); final InterruptedException interruptedException = new InterruptedException(); expect(computable.compute(input)).andThrow(interruptedException).andReturn(answer); replay(computable); try { memoizer.compute(input); fail("Expected Throwable to be thrown!"); } catch (final Throwable expected) { // Should always be thrown the first time } assertEquals(answer, memoizer.compute(input)); }