Test for supportsEventType mismatch with unrelated event type

See gh-30712
This commit is contained in:
Juergen Hoeller 2023-06-21 18:24:38 +02:00
parent 9a5290ea27
commit 09cf489c6b
1 changed files with 33 additions and 18 deletions

View File

@ -335,11 +335,10 @@ public class ApplicationListenerMethodAdapterTests extends AbstractApplicationEv
verify(this.context, times(2)).getBean("testBean"); verify(this.context, times(2)).getBean("testBean");
} }
// see https://github.com/spring-projects/spring-framework/issues/30399 @Test // gh-30399
@Test
void simplePayloadDoesNotSupportArbitraryGenericEventType() throws Exception { void simplePayloadDoesNotSupportArbitraryGenericEventType() throws Exception {
var method = SampleEvents.class.getDeclaredMethod("handleString", String.class); Method method = SampleEvents.class.getDeclaredMethod("handleString", String.class);
var adapter = new ApplicationListenerMethodAdapter(null, ApplicationListenerMethodAdapterTests.class, method); ApplicationListenerMethodAdapter adapter = createTestInstance(method);
assertThat(adapter.supportsEventType(createPayloadEventType(ResolvableType.forClassWithGenerics(EntityWrapper.class, Integer.class)))) assertThat(adapter.supportsEventType(createPayloadEventType(ResolvableType.forClassWithGenerics(EntityWrapper.class, Integer.class))))
.as("handleString(String) with EntityWrapper<Integer>").isFalse(); .as("handleString(String) with EntityWrapper<Integer>").isFalse();
@ -349,11 +348,10 @@ public class ApplicationListenerMethodAdapterTests extends AbstractApplicationEv
.as("handleString(String) with String").isTrue(); .as("handleString(String) with String").isTrue();
} }
// see https://github.com/spring-projects/spring-framework/issues/30399 @Test // gh-30399
@Test
void genericPayloadDoesNotSupportArbitraryGenericEventType() throws Exception { void genericPayloadDoesNotSupportArbitraryGenericEventType() throws Exception {
var method = SampleEvents.class.getDeclaredMethod("handleGenericStringPayload", EntityWrapper.class); Method method = SampleEvents.class.getDeclaredMethod("handleGenericStringPayload", EntityWrapper.class);
var adapter = new ApplicationListenerMethodAdapter(null, ApplicationListenerMethodAdapterTests.class, method); ApplicationListenerMethodAdapter adapter = createTestInstance(method);
assertThat(adapter.supportsEventType(createPayloadEventType(ResolvableType.forClass(EntityWrapper.class)))) assertThat(adapter.supportsEventType(createPayloadEventType(ResolvableType.forClass(EntityWrapper.class))))
.as("handleGenericStringPayload(EntityWrapper<String>) with EntityWrapper<?>").isFalse(); .as("handleGenericStringPayload(EntityWrapper<String>) with EntityWrapper<?>").isFalse();
@ -363,11 +361,10 @@ public class ApplicationListenerMethodAdapterTests extends AbstractApplicationEv
.as("handleGenericStringPayload(EntityWrapper<String>) with EntityWrapper<String>").isTrue(); .as("handleGenericStringPayload(EntityWrapper<String>) with EntityWrapper<String>").isTrue();
} }
// see https://github.com/spring-projects/spring-framework/issues/30399 @Test // gh-30399
@Test
void rawGenericPayloadDoesNotSupportArbitraryGenericEventType() throws Exception { void rawGenericPayloadDoesNotSupportArbitraryGenericEventType() throws Exception {
var method = SampleEvents.class.getDeclaredMethod("handleGenericAnyPayload", EntityWrapper.class); Method method = SampleEvents.class.getDeclaredMethod("handleGenericAnyPayload", EntityWrapper.class);
var adapter = new ApplicationListenerMethodAdapter(null, ApplicationListenerMethodAdapterTests.class, method); ApplicationListenerMethodAdapter adapter = createTestInstance(method);
assertThat(adapter.supportsEventType(createPayloadEventType(ResolvableType.forClass(EntityWrapper.class)))) assertThat(adapter.supportsEventType(createPayloadEventType(ResolvableType.forClass(EntityWrapper.class))))
.as("handleGenericAnyPayload(EntityWrapper<?>) with EntityWrapper<?>").isTrue(); .as("handleGenericAnyPayload(EntityWrapper<?>) with EntityWrapper<?>").isTrue();
@ -381,10 +378,10 @@ public class ApplicationListenerMethodAdapterTests extends AbstractApplicationEv
.as("handleGenericAnyPayload(EntityWrapper<?>) with List<String>").isFalse(); .as("handleGenericAnyPayload(EntityWrapper<?>) with List<String>").isFalse();
} }
@Test @Test // gh-30399
void genericApplicationEventSupportsSpecificType() throws Exception { void genericApplicationEventSupportsSpecificType() throws Exception {
var method = SampleEvents.class.getDeclaredMethod("handleGenericString", GenericTestEvent.class); Method method = SampleEvents.class.getDeclaredMethod("handleGenericString", GenericTestEvent.class);
var adapter = new ApplicationListenerMethodAdapter(null, ApplicationListenerMethodAdapterTests.class, method); ApplicationListenerMethodAdapter adapter = createTestInstance(method);
assertThat(adapter.supportsEventType(ResolvableType.forClass(GenericTestEvent.class))) assertThat(adapter.supportsEventType(ResolvableType.forClass(GenericTestEvent.class)))
.as("handleGenericString(GenericTestEvent<String>) with GenericTestEvent<?>").isTrue(); .as("handleGenericString(GenericTestEvent<String>) with GenericTestEvent<?>").isTrue();
@ -394,10 +391,10 @@ public class ApplicationListenerMethodAdapterTests extends AbstractApplicationEv
.as("handleGenericString(GenericTestEvent<String>) with GenericTestEvent<String>").isTrue(); .as("handleGenericString(GenericTestEvent<String>) with GenericTestEvent<String>").isTrue();
} }
@Test @Test // gh-30399
void genericRawApplicationEventSupportsRawTypeAndAnySpecificType() throws Exception { void genericRawApplicationEventSupportsRawTypeAndAnySpecificType() throws Exception {
var method = SampleEvents.class.getDeclaredMethod("handleGenericRaw", GenericTestEvent.class); Method method = SampleEvents.class.getDeclaredMethod("handleGenericRaw", GenericTestEvent.class);
var adapter = new ApplicationListenerMethodAdapter(null, ApplicationListenerMethodAdapterTests.class, method); ApplicationListenerMethodAdapter adapter = createTestInstance(method);
assertThat(adapter.supportsEventType(ResolvableType.forClass(GenericTestEvent.class))) assertThat(adapter.supportsEventType(ResolvableType.forClass(GenericTestEvent.class)))
.as("handleGenericRaw(GenericTestEvent<?>) with GenericTestEvent<?>").isTrue(); .as("handleGenericRaw(GenericTestEvent<?>) with GenericTestEvent<?>").isTrue();
@ -407,6 +404,20 @@ public class ApplicationListenerMethodAdapterTests extends AbstractApplicationEv
.as("handleGenericRaw(GenericTestEvent<?>) with GenericTestEvent<Integer>").isTrue(); .as("handleGenericRaw(GenericTestEvent<?>) with GenericTestEvent<Integer>").isTrue();
} }
@Test // gh-30399
void unrelatedApplicationEventDoesNotSupportRawTypeOrAnySpecificType() throws Exception {
Method method = SampleEvents.class.getDeclaredMethod("handleUnrelated", ContextRefreshedEvent.class);
ApplicationListenerMethodAdapter adapter = createTestInstance(method);
assertThat(adapter.supportsEventType(ResolvableType.forClass(GenericTestEvent.class)))
.as("handleUnrelated(ContextRefreshedEvent) with GenericTestEvent<?>").isFalse();
assertThat(adapter.supportsEventType(ResolvableType.forClassWithGenerics(GenericTestEvent.class, String.class)))
.as("handleUnrelated(ContextRefreshedEvent) with GenericTestEvent<String>").isFalse();
assertThat(adapter.supportsEventType(ResolvableType.forClassWithGenerics(GenericTestEvent.class, Integer.class)))
.as("handleUnrelated(ContextRefreshedEvent) with GenericTestEvent<Integer>").isFalse();
}
private void supportsEventType(boolean match, Method method, ResolvableType eventType) { private void supportsEventType(boolean match, Method method, ResolvableType eventType) {
ApplicationListenerMethodAdapter adapter = createTestInstance(method); ApplicationListenerMethodAdapter adapter = createTestInstance(method);
assertThat(adapter.supportsEventType(eventType)) assertThat(adapter.supportsEventType(eventType))
@ -462,6 +473,10 @@ public class ApplicationListenerMethodAdapterTests extends AbstractApplicationEv
public void handleGenericRaw(GenericTestEvent<?> event) { public void handleGenericRaw(GenericTestEvent<?> event) {
} }
@EventListener
public void handleUnrelated(ContextRefreshedEvent event) {
}
@EventListener @EventListener
public void handleString(String payload) { public void handleString(String payload) {
} }