EventAspectAdvice { @Around("@annotation(anno)") public Object logOutboundProcessingEvent(ProceedingJoinPoint joinPoint, OutboundProcessingEvent anno) throws Throwable { return logEvents(joinPoint, outboundProcessingAdviceDelegate, anno.beforeBuilder(), anno.afterReturningBuilder(), anno.serviceType(), anno.version()); }  @AfterThrowing(pointcut = "@annotation(gov.hhs.fha.nhinc.aspect.LogFailures)", throwing = "e") void logFailureAnnotation(JoinPoint joinPoint, Throwable e); @Around("@annotation(anno)") Object logInboundMessageEvent(ProceedingJoinPoint joinPoint, InboundMessageEvent anno); @Around("@annotation(anno)") Object logInboundProcessingEvent(ProceedingJoinPoint joinPoint, InboundProcessingEvent anno); @Around("@annotation(anno)") Object logAdapterDelegationEvent(ProceedingJoinPoint joinPoint, AdapterDelegationEvent anno); @Around("@annotation(anno)") Object logOutboundMessageEvent(ProceedingJoinPoint joinPoint, OutboundMessageEvent anno); @Around("@annotation(anno)") Object logOutboundProcessingEvent(ProceedingJoinPoint joinPoint, OutboundProcessingEvent anno); @Around("@annotation(anno)") Object logNwhinInvocationEvent(ProceedingJoinPoint joinPoint, NwhinInvocationEvent anno); Object logEvents(ProceedingJoinPoint joinPoint, EventAdviceDelegate delegate, Class<? extends EventDescriptionBuilder> beforeBuilder,
        Class<? extends EventDescriptionBuilder> afterBuilder, String serviceType, String version); void logFailure(JoinPoint joinPoint, Throwable e, String service, String version);  }
@Test public void verifyOutboundProcessingEvent() throws Throwable { advice.logOutboundProcessingEvent(mockJoinPoint, outboundProcessingEvent); verify(outboundProcessingAdviceDelegate).begin(any(Object[].class), eq("test-serviceType"), eq("test-version"), eq(beforeBuilderAnswer.answer(null))); verify(outboundProcessingAdviceDelegate).end(any(Object[].class), eq("test-serviceType"), eq("test-version"), eq(afterReturningBuilderAnswer.answer(null)), any(Object.class)); }