@Test
 public void testHandlerDispatching_WithReturnType() throws Throwable {
   Object actualReturnValue =
       testSubject.handle(GenericCommandMessage.asCommandMessage(1L), mockUnitOfWork);
   assertEquals(1L, actualReturnValue);
   assertEquals(0, mockTarget.voidHandlerInvoked);
   assertEquals(1, mockTarget.returningHandlerInvoked);
 }
 @Test
 public void testHandlerDispatching_ThrowingException() throws Throwable {
   try {
     testSubject.handle(GenericCommandMessage.asCommandMessage(new HashSet()), mockUnitOfWork);
     fail("Expected exception");
   } catch (Exception ex) {
     assertEquals(Exception.class, ex.getClass());
   }
 }
  public static void main(String[] args) {
    CommandBus cb = new SimpleCommandBus();

    InMemoryEventStore eventStore = new InMemoryEventStore();
    eventStore.appendInitialEvent(
        new SimpleDomainEventStream(
            new GenericDomainEventMessage<>(aggregateIdentifier.toString(), 0, new SomeEvent())));

    final MyAggregate myAggregate = new MyAggregate(aggregateIdentifier);
    Repository<MyAggregate> repository =
        new Repository<MyAggregate>() {
          @Override
          public MyAggregate load(String aggregateIdentifier, Long expectedVersion) {
            throw new UnsupportedOperationException("Not implemented yet");
          }

          @Override
          public MyAggregate load(String aggregateIdentifier) {
            return myAggregate;
          }

          @Override
          public void add(MyAggregate aggregate) {
            throw new UnsupportedOperationException("Not implemented yet");
          }
        };
    cb.subscribe(String.class.getName(), new MyCommandHandler(repository));
    //        new AnnotationCommandHandlerAdapter(new MyCommandHandler(repository), cb).subscribe();

    long COMMAND_COUNT = 5 * 1000 * 1000;
    cb.dispatch(GenericCommandMessage.asCommandMessage("ready,"));
    long t1 = System.currentTimeMillis();
    for (int t = 0; t < COMMAND_COUNT; t++) {
      cb.dispatch(GenericCommandMessage.asCommandMessage("go!"));
    }
    long t2 = System.currentTimeMillis();
    System.out.println(
        String.format("Just did %d commands per second", ((COMMAND_COUNT * 1000) / (t2 - t1))));
  }
  @SuppressWarnings({"unchecked"})
  @Test
  public void testEventHandlerCallsRedirectToAdapter() throws Throwable {
    Object result1 =
        testSubject.postProcessBeforeInitialization(new AnnotatedCommandHandler(), "beanName");
    Object postProcessedBean = testSubject.postProcessAfterInitialization(result1, "beanName");

    assertTrue(Enhancer.isEnhanced(postProcessedBean.getClass()));
    assertTrue(postProcessedBean instanceof CommandHandler);
    assertTrue(postProcessedBean instanceof AnnotatedCommandHandler);

    CommandHandler<MyCommand> commandHandler = (CommandHandler<MyCommand>) postProcessedBean;
    AnnotatedCommandHandler annotatedCommandHandler = (AnnotatedCommandHandler) postProcessedBean;
    CommandMessage<MyCommand> myCommand = GenericCommandMessage.asCommandMessage(new MyCommand());
    commandHandler.handle(myCommand, null);

    assertEquals(1, annotatedCommandHandler.getInvocationCount());
  }
  /** This test should make sure the problem described in issue #91 does not occur anymore */
  @Test
  public void testCallbackCalled() {
    SimpleCommandBus scb = new SimpleCommandBus();
    AnnotationCommandHandlerAdapter.subscribe(this, scb);

    scb.dispatch(
        GenericCommandMessage.asCommandMessage("Hello"),
        new VoidCallback() {
          @Override
          protected void onSuccess() {
            // what I expected
          }

          @Override
          public void onFailure(Throwable cause) {
            cause.printStackTrace();
            fail("Did not expect a failure");
          }
        });
  }
 @Test(expected = NoHandlerForCommandException.class)
 public void testHandle_NoHandlerForCommand() throws Throwable {
   testSubject.handle(GenericCommandMessage.asCommandMessage(new LinkedList()), null);
 }
 private <R> FutureCallback<R> doSend(Object command) {
   FutureCallback<R> futureCallback = new FutureCallback<R>();
   commandBus.dispatch(GenericCommandMessage.asCommandMessage(command), futureCallback);
   return futureCallback;
 }