Skip to content

Commit ffabe11

Browse files
committed
Polish 'Include @bean method annotations in ContainerConnectionSource'
See gh-50033
1 parent fe5424b commit ffabe11

2 files changed

Lines changed: 21 additions & 30 deletions

File tree

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@
1616

1717
package org.springframework.boot.testcontainers.service.connection;
1818

19-
import java.lang.reflect.Method;
2019
import java.util.LinkedHashSet;
2120
import java.util.Set;
2221

2322
import org.testcontainers.containers.Container;
2423

2524
import org.springframework.beans.factory.BeanFactory;
2625
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
26+
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
2727
import org.springframework.beans.factory.config.BeanDefinition;
2828
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2929
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
30-
import org.springframework.beans.factory.support.RootBeanDefinition;
3130
import org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactories;
3231
import org.springframework.boot.origin.Origin;
3332
import org.springframework.boot.testcontainers.beans.TestcontainerBeanDefinition;
@@ -63,8 +62,7 @@ private void registerBeanDefinitions(ConfigurableListableBeanFactory beanFactory
6362
new ConnectionDetailsFactories(null));
6463
for (String beanName : beanFactory.getBeanNamesForType(Container.class)) {
6564
BeanDefinition beanDefinition = getBeanDefinition(beanFactory, beanName);
66-
MergedAnnotations annotations = (beanDefinition instanceof TestcontainerBeanDefinition testcontainerBeanDefinition)
67-
? testcontainerBeanDefinition.getAnnotations() : getAnnotationsFromFactoryMethod(beanDefinition);
65+
MergedAnnotations annotations = getAnnotations(beanDefinition);
6866
for (ServiceConnection serviceConnection : getServiceConnections(beanFactory, beanName, annotations)) {
6967
ContainerConnectionSource<?> source = createSource(beanFactory, beanName, beanDefinition, annotations,
7068
serviceConnection);
@@ -73,12 +71,12 @@ private void registerBeanDefinitions(ConfigurableListableBeanFactory beanFactory
7371
}
7472
}
7573

76-
private MergedAnnotations getAnnotationsFromFactoryMethod(BeanDefinition beanDefinition) {
77-
if (beanDefinition instanceof RootBeanDefinition rootBeanDefinition) {
78-
Method factoryMethod = rootBeanDefinition.getResolvedFactoryMethod();
79-
if (factoryMethod != null) {
80-
return MergedAnnotations.from(factoryMethod, MergedAnnotations.SearchStrategy.DIRECT);
81-
}
74+
private MergedAnnotations getAnnotations(BeanDefinition beanDefinition) {
75+
if (beanDefinition instanceof TestcontainerBeanDefinition testcontainerBeanDefinition) {
76+
return testcontainerBeanDefinition.getAnnotations();
77+
}
78+
if (beanDefinition instanceof AnnotatedBeanDefinition annotatedBeanDefinition) {
79+
return annotatedBeanDefinition.getFactoryMethodMetadata().getAnnotations();
8280
}
8381
return null;
8482
}

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

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,32 @@
1919
import org.junit.jupiter.api.Test;
2020
import org.testcontainers.containers.PostgreSQLContainer;
2121

22-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
22+
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2324
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory.ContainerConnectionDetails;
24-
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
2525
import org.springframework.context.annotation.Bean;
2626
import org.springframework.context.annotation.Configuration;
2727

2828
import static org.assertj.core.api.Assertions.assertThat;
2929
import static org.mockito.Mockito.mock;
3030

3131
/**
32-
* Tests for {@link ServiceConnectionAutoConfigurationRegistrar} to verify that
33-
* annotations on {@link Bean @Bean} methods are available in
34-
* {@link ContainerConnectionSource}.
32+
* Tests for {@link ServiceConnectionAutoConfigurationRegistrar}.
3533
*
3634
* @author Daeho Kwon
3735
*/
3836
class ServiceConnectionAutoConfigurationRegistrarTests {
3937

4038
@Test
4139
void sslAnnotationOnBeanMethodShouldBeDetectedInContainerConnectionSource() {
42-
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
43-
context.register(WithServiceConnectionAutoConfiguration.class, ContainerConfiguration.class);
44-
context.refresh();
45-
ContainerConnectionDetails<?> details = (ContainerConnectionDetails<?>) context
46-
.getBean(DatabaseConnectionDetails.class);
47-
assertThat(details.hasAnnotation(Ssl.class)).isTrue();
48-
}
49-
}
50-
51-
@Configuration(proxyBeanMethods = false)
52-
@ImportAutoConfiguration(ServiceConnectionAutoConfiguration.class)
53-
static class WithServiceConnectionAutoConfiguration {
54-
40+
new ApplicationContextRunner()
41+
.withConfiguration(AutoConfigurations.of(ServiceConnectionAutoConfiguration.class))
42+
.withUserConfiguration(ContainerConfiguration.class)
43+
.run((context) -> {
44+
ContainerConnectionDetails<?> connectionDetails = (ContainerConnectionDetails<?>) context
45+
.getBean(DatabaseConnectionDetails.class);
46+
assertThat(connectionDetails.hasAnnotation(Ssl.class)).isTrue();
47+
});
5548
}
5649

5750
@Configuration(proxyBeanMethods = false)
@@ -60,8 +53,8 @@ static class ContainerConfiguration {
6053
@Bean
6154
@ServiceConnection
6255
@Ssl
63-
PostgreSQLContainer container() {
64-
return mock(PostgreSQLContainer.class);
56+
PostgreSQLContainer<?> container() {
57+
return mock();
6558
}
6659

6760
}

0 commit comments

Comments
 (0)