WrappedCloseableIterable implements CloseableIterable<T> { @Override public CloseableIterator<T> iterator() { final Iterator<T> iterator = iterable.iterator(); if (iterator instanceof CloseableIterator) { return (CloseableIterator<T>) iterator; } return new WrappedCloseableIterator<>(iterator); } WrappedCloseableIterable();  WrappedCloseableIterable(final Iterable<T> iterable);  WrappedCloseableIterable(final Iterator<T> iterator); @Override void close(); @Override CloseableIterator<T> iterator(); @Override String toString();  }
@Test public void shouldDelegateIteratorToWrappedCloseableIterable() { final CloseableIterable<Object> closeableIterable = mock(CloseableIterable.class); final WrappedCloseableIterable<Object> wrappedIterable = new WrappedCloseableIterable<>(closeableIterable); final CloseableIterator<Object> closeableIterator = mock(CloseableIterator.class); given(closeableIterable.iterator()).willReturn(closeableIterator); final CloseableIterator<Object> result = wrappedIterable.iterator(); assertEquals(closeableIterator, result); }
@Test public void shouldDelegateIteratorToWrappedIterable() { final Iterable<Object> iterable = mock(Iterable.class); final WrappedCloseableIterable<Object> wrappedIterable = new WrappedCloseableIterable<>(iterable); final Iterator<Object> iterator = mock(Iterator.class); given(iterable.iterator()).willReturn(iterator); final CloseableIterator<Object> result = wrappedIterable.iterator(); result.hasNext(); verify(iterator).hasNext(); }