@Test public void orderedListeners() { load(OrderedTestListener.class); OrderedTestListener listener = this.context.getBean(OrderedTestListener.class); assertTrue(listener.order.isEmpty()); this.context.publishEvent("whatever"); assertThat(listener.order, contains("first", "second", "third")); }
@Test public void asyncProcessingAppliedWithInterfaceProxy() throws InterruptedException { doLoad(AsyncConfigurationWithInterfaces.class, SimpleProxyTestBean.class); String threadName = Thread.currentThread().getName(); AnotherTestEvent event = new AnotherTestEvent(this, threadName); SimpleService listener = this.context.getBean(SimpleService.class); this.eventCollector.assertNoEventReceived(listener); this.context.publishEvent(event); this.countDownLatch.await(2, TimeUnit.SECONDS); this.eventCollector.assertEvent(listener, event); this.eventCollector.assertTotalEventsCount(1); }
@Test public void asyncProcessingApplied() throws InterruptedException { loadAsync(AsyncEventListener.class); String threadName = Thread.currentThread().getName(); AnotherTestEvent event = new AnotherTestEvent(this, threadName); AsyncEventListener listener = this.context.getBean(AsyncEventListener.class); this.eventCollector.assertNoEventReceived(listener); this.context.publishEvent(event); this.countDownLatch.await(2, TimeUnit.SECONDS); this.eventCollector.assertEvent(listener, event); this.eventCollector.assertTotalEventsCount(1); }
@Test public void listenerWithSimplePayload() { load(TestEventListener.class); TestEventListener listener = this.context.getBean(TestEventListener.class); this.eventCollector.assertNoEventReceived(listener); this.context.publishEvent("test"); this.eventCollector.assertEvent(listener, "test"); this.eventCollector.assertTotalEventsCount(1); }
@Test public void simpleEventXmlConfig() { this.context = new ClassPathXmlApplicationContext( "org/springframework/context/event/simple-event-configuration.xml"); TestEvent event = new TestEvent(this, "test"); TestEventListener listener = this.context.getBean(TestEventListener.class); this.eventCollector = getEventCollector(this.context); this.eventCollector.assertNoEventReceived(listener); this.context.publishEvent(event); this.eventCollector.assertEvent(listener, event); this.eventCollector.assertTotalEventsCount(1); }
@Test public void exceptionNotPropagatedWithAsync() throws InterruptedException { loadAsync(ExceptionEventListener.class); AnotherTestEvent event = new AnotherTestEvent(this, "fail"); ExceptionEventListener listener = this.context.getBean(ExceptionEventListener.class); this.eventCollector.assertNoEventReceived(listener); this.context.publishEvent(event); this.countDownLatch.await(2, TimeUnit.SECONDS); this.eventCollector.assertEvent(listener, event); this.eventCollector.assertTotalEventsCount(1); }
@Test public void listenerWithNonMatchingPayload() { load(TestEventListener.class); TestEventListener listener = this.context.getBean(TestEventListener.class); this.eventCollector.assertNoEventReceived(listener); this.context.publishEvent(123L); this.eventCollector.assertNoEventReceived(listener); this.eventCollector.assertTotalEventsCount(0); }
@Test public void listenerWithGenericApplicationEvent() { load(GenericEventListener.class); GenericEventListener listener = this.context.getBean(GenericEventListener.class); this.eventCollector.assertNoEventReceived(listener); this.context.publishEvent("TEST"); this.eventCollector.assertEvent(listener, "TEST"); this.eventCollector.assertTotalEventsCount(1); }
@Test public void listenerWithResolvableTypeEventWrongGeneric() { load(ResolvableTypeEventListener.class); ResolvableTypeEventListener listener = this.context.getBean(ResolvableTypeEventListener.class); this.eventCollector.assertNoEventReceived(listener); GenericEventPojo<Long> event = new GenericEventPojo<>(123L); this.context.publishEvent(event); this.eventCollector.assertNoEventReceived(listener); this.eventCollector.assertTotalEventsCount(0); }
@Test public void metaAnnotationIsDiscovered() { load(MetaAnnotationListenerTestBean.class); MetaAnnotationListenerTestBean bean = this.context.getBean(MetaAnnotationListenerTestBean.class); this.eventCollector.assertNoEventReceived(bean); TestEvent event = new TestEvent(); this.context.publishEvent(event); this.eventCollector.assertEvent(bean, event); this.eventCollector.assertTotalEventsCount(1); }
@Test public void listenerWithResolvableTypeEvent() { load(ResolvableTypeEventListener.class); ResolvableTypeEventListener listener = this.context.getBean(ResolvableTypeEventListener.class); this.eventCollector.assertNoEventReceived(listener); GenericEventPojo<String> event = new GenericEventPojo<>("TEST"); this.context.publishEvent(event); this.eventCollector.assertEvent(listener, event); this.eventCollector.assertTotalEventsCount(1); }
@Test public void nullReplyIgnored() { load(TestEventListener.class, ReplyEventListener.class); AnotherTestEvent event = new AnotherTestEvent(this, null); // No response ReplyEventListener replyEventListener = this.context.getBean(ReplyEventListener.class); TestEventListener listener = this.context.getBean(TestEventListener.class); this.eventCollector.assertNoEventReceived(listener); this.eventCollector.assertNoEventReceived(replyEventListener); this.context.publishEvent(event); this.eventCollector.assertEvent(replyEventListener, event); this.eventCollector.assertNoEventReceived(listener); this.eventCollector.assertTotalEventsCount(1); }
@Test public void afterCommitWithTransactionalComponentListenerProxiedViaDynamicProxy() { load(TransactionalConfiguration.class, TransactionalComponentTestListener.class); this.transactionTemplate.execute(status -> { getContext().publishEvent("SKIP"); getEventCollector().assertNoEventReceived(); return null; }); getEventCollector().assertNoEventReceived(); }
@Test public void beanAutomaticallyHearsEvents() throws Exception { //String[] listenerNames = ((ListableBeanFactory) applicationContext).getBeanDefinitionNames(ApplicationListener.class); //assertTrue("listeners include beanThatListens", Arrays.asList(listenerNames).contains("beanThatListens")); BeanThatListens b = (BeanThatListens) applicationContext.getBean("beanThatListens"); b.zero(); assertTrue("0 events before publication", b.getEventCount() == 0); this.applicationContext.publishEvent(new MyEvent(this)); assertTrue("1 events after publication, not " + b.getEventCount(), b.getEventCount() == 1); }
@Test public void afterCompletionCommit() { load(AfterCompletionTestListener.class); this.transactionTemplate.execute(status -> { getContext().publishEvent("test"); getEventCollector().assertNoEventReceived(); return null; }); getEventCollector().assertEvents(EventCollector.AFTER_COMPLETION, "test"); getEventCollector().assertTotalEventsCount(1); // After rollback not invoked }
@Test public void afterCommit() { load(AfterCompletionExplicitTestListener.class); this.transactionTemplate.execute(status -> { getContext().publishEvent("test"); getEventCollector().assertNoEventReceived(); return null; }); getEventCollector().assertEvents(EventCollector.AFTER_COMMIT, "test"); getEventCollector().assertTotalEventsCount(1); // After rollback not invoked }
@Test public void afterCompletionRollback() { load(AfterCompletionTestListener.class); this.transactionTemplate.execute(status -> { getContext().publishEvent("test"); getEventCollector().assertNoEventReceived(); status.setRollbackOnly(); return null; }); getEventCollector().assertEvents(EventCollector.AFTER_COMPLETION, "test"); getEventCollector().assertTotalEventsCount(1); // After rollback not invoked }
@Test public void immediately() { load(ImmediateTestListener.class); this.transactionTemplate.execute(status -> { getContext().publishEvent("test"); getEventCollector().assertEvents(EventCollector.IMMEDIATELY, "test"); getEventCollector().assertTotalEventsCount(1); return null; }); getEventCollector().assertEvents(EventCollector.IMMEDIATELY, "test"); getEventCollector().assertTotalEventsCount(1); }
@Test public void noTransactionWithFallbackExecution() { load(FallbackExecutionTestListener.class); this.context.publishEvent("test"); this.eventCollector.assertEvents(EventCollector.BEFORE_COMMIT, "test"); this.eventCollector.assertEvents(EventCollector.AFTER_COMMIT, "test"); this.eventCollector.assertEvents(EventCollector.AFTER_ROLLBACK, "test"); this.eventCollector.assertEvents(EventCollector.AFTER_COMPLETION, "test"); getEventCollector().assertTotalEventsCount(4); }
protected void doTestEvents(TestListener listener, TestListener parentListener, MyEvent event) { listener.zeroCounter(); parentListener.zeroCounter(); assertTrue("0 events before publication", listener.getEventCount() == 0); assertTrue("0 parent events before publication", parentListener.getEventCount() == 0); this.applicationContext.publishEvent(event); assertTrue("1 events after publication, not " + listener.getEventCount(), listener.getEventCount() == 1); assertTrue("1 parent events after publication", parentListener.getEventCount() == 1); }