From 874e61a0c681634dc994882bb8dd0b7b6dc8c752 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 19 Feb 2024 18:18:09 +0100 Subject: [PATCH] Test for async event publication before listener initialized Closes gh-20904 See gh-23501 See gh-25799 --- .../event/ApplicationContextEventTests.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java b/spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java index cc26a34e56..184ccdb22e 100644 --- a/spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java +++ b/spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java @@ -567,7 +567,7 @@ class ApplicationContextEventTests extends AbstractApplicationEventListenerTests } @Test - void initMethodPublishesEvent() { + void initMethodPublishesEvent() { // gh-25799 GenericApplicationContext context = new GenericApplicationContext(); context.registerBeanDefinition("listener", new RootBeanDefinition(BeanThatListens.class)); context.registerBeanDefinition("messageSource", new RootBeanDefinition(StaticMessageSource.class)); @@ -582,7 +582,7 @@ class ApplicationContextEventTests extends AbstractApplicationEventListenerTests } @Test - void initMethodPublishesAsyncEvent() { + void initMethodPublishesAsyncEvent() { // gh-25799 GenericApplicationContext context = new GenericApplicationContext(); context.registerBeanDefinition("listener", new RootBeanDefinition(BeanThatListens.class)); context.registerBeanDefinition("messageSource", new RootBeanDefinition(StaticMessageSource.class)); @@ -596,6 +596,21 @@ class ApplicationContextEventTests extends AbstractApplicationEventListenerTests context.close(); } + @Test + void initMethodPublishesAsyncEventBeforeListenerInitialized() { // gh-20904 + GenericApplicationContext context = new GenericApplicationContext(); + context.registerBeanDefinition("messageSource", new RootBeanDefinition(StaticMessageSource.class)); + context.registerBeanDefinition("initMethod", new RootBeanDefinition(AsyncEventPublishingInitMethod.class)); + context.registerBeanDefinition("listener", new RootBeanDefinition(BeanThatListens.class)); + context.refresh(); + + context.publishEvent(new MyEvent(this)); + BeanThatListens listener = context.getBean(BeanThatListens.class); + assertThat(listener.getEventCount()).isEqualTo(3); + + context.close(); + } + @SuppressWarnings("serial") public static class MyEvent extends ApplicationEvent {