Browse Source

Search implemented interfaces for @ServiceConnection fields

Fixes gh-37671
pull/38706/head
Scott Frederick 2 years ago
parent
commit
86216fb4e9
  1. 4
      spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactory.java
  2. 49
      spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactoryTests.java

4
spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactory.java

@ -41,6 +41,7 @@ import org.springframework.util.ReflectionUtils; @@ -41,6 +41,7 @@ import org.springframework.util.ReflectionUtils;
* @author Moritz Halbritter
* @author Andy Wilkinson
* @author Phillip Webb
* @author Scott Frederick
*/
class ServiceConnectionContextCustomizerFactory implements ContextCustomizerFactory {
@ -61,6 +62,9 @@ class ServiceConnectionContextCustomizerFactory implements ContextCustomizerFact @@ -61,6 +62,9 @@ class ServiceConnectionContextCustomizerFactory implements ContextCustomizerFact
if (TestContextAnnotationUtils.searchEnclosingClass(clazz)) {
findSources(clazz.getEnclosingClass(), sources);
}
for (Class<?> implementedInterface : clazz.getInterfaces()) {
findSources(implementedInterface, sources);
}
}
@SuppressWarnings("unchecked")

49
spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ServiceConnectionContextCustomizerFactoryTests.java

@ -71,7 +71,31 @@ class ServiceConnectionContextCustomizerFactoryTests { @@ -71,7 +71,31 @@ class ServiceConnectionContextCustomizerFactoryTests {
}
@Test
void createContextCustomizerWhenClassHasNonStaticServiceConnectionFailsWithHepfulException() {
void createContextCustomizerWhenInterfaceHasServiceConnectionsReturnsCustomizer() {
ServiceConnectionContextCustomizer customizer = (ServiceConnectionContextCustomizer) this.factory
.createContextCustomizer(ServiceConnectionsInterface.class, null);
assertThat(customizer).isNotNull();
assertThat(customizer.getSources()).hasSize(2);
}
@Test
void createContextCustomizerWhenSuperclassHasServiceConnectionsReturnsCustomizer() {
ServiceConnectionContextCustomizer customizer = (ServiceConnectionContextCustomizer) this.factory
.createContextCustomizer(ServiceConnectionsSubclass.class, null);
assertThat(customizer).isNotNull();
assertThat(customizer.getSources()).hasSize(2);
}
@Test
void createContextCustomizerWhenImplementedInterfaceHasServiceConnectionsReturnsCustomizer() {
ServiceConnectionContextCustomizer customizer = (ServiceConnectionContextCustomizer) this.factory
.createContextCustomizer(ServiceConnectionsImpl.class, null);
assertThat(customizer).isNotNull();
assertThat(customizer.getSources()).hasSize(2);
}
@Test
void createContextCustomizerWhenClassHasNonStaticServiceConnectionFailsWithHelpfulException() {
assertThatIllegalStateException()
.isThrownBy(() -> this.factory.createContextCustomizer(NonStaticServiceConnection.class, null))
.withMessage("@ServiceConnection field 'service' must be static");
@ -79,7 +103,7 @@ class ServiceConnectionContextCustomizerFactoryTests { @@ -79,7 +103,7 @@ class ServiceConnectionContextCustomizerFactoryTests {
}
@Test
void createContextCustomizerWhenClassHasAnnotationOnNonConnectionFieldFailsWithHepfulException() {
void createContextCustomizerWhenClassHasAnnotationOnNonConnectionFieldFailsWithHelpfulException() {
assertThatIllegalStateException()
.isThrownBy(() -> this.factory.createContextCustomizer(ServiceConnectionOnWrongFieldType.class, null))
.withMessage("Field 'service2' in " + ServiceConnectionOnWrongFieldType.class.getName()
@ -141,6 +165,27 @@ class ServiceConnectionContextCustomizerFactoryTests { @@ -141,6 +165,27 @@ class ServiceConnectionContextCustomizerFactoryTests {
}
interface ServiceConnectionsInterface {
@ServiceConnection
Container<?> service1 = new MockContainer();
@ServiceConnection
Container<?> service2 = new MockContainer();
default void dummy() {
}
}
static class ServiceConnectionsSubclass extends ServiceConnections {
}
static class ServiceConnectionsImpl implements ServiceConnectionsInterface {
}
static class NonStaticServiceConnection {
@ServiceConnection

Loading…
Cancel
Save