private void createSpy(final DomainEventStream eventStream) {
   lastSpy = mock(DomainEventStream.class);
   when(lastSpy.next())
       .thenAnswer(
           new Answer<Object>() {
             @Override
             public Object answer(InvocationOnMock invocation) throws Throwable {
               return eventStream.next();
             }
           });
   when(lastSpy.hasNext())
       .thenAnswer(
           new Answer<Object>() {
             @Override
             public Object answer(InvocationOnMock invocation) throws Throwable {
               return eventStream.hasNext();
             }
           });
   when(lastSpy.peek())
       .thenAnswer(
           new Answer<Object>() {
             @Override
             public Object answer(InvocationOnMock invocation) throws Throwable {
               return eventStream.peek();
             }
           });
 }
 @Override
 public void appendEvents(String type, DomainEventStream events) {
   if (!events.hasNext()) {
     return;
   }
   String key = events.peek().getAggregateIdentifier().toString();
   DomainEventMessage<?> lastEvent = null;
   while (events.hasNext()) {
     countDownLatch.countDown();
     lastEvent = events.next();
   }
   storedEvents.put(key, lastEvent);
 }
 @Override
 public void appendEvents(String type, DomainEventStream events) {
   if (!events.hasNext()) {
     return;
   }
   String key = events.peek().getAggregateIdentifier().toString();
   DomainEventMessage<?> lastEvent = null;
   while (events.hasNext()) {
     countDownLatch.countDown();
     lastEvent = events.next();
     if (FailingEvent.class.isAssignableFrom(lastEvent.getPayloadType())) {
       throw new RuntimeException("This is a failing event. EventStore refuses to store that");
     }
   }
   storedEvents.put(key, lastEvent);
 }
 @Override
 public DomainEventMessage peek() {
   return delegate.peek();
 }