Add support for creating a container from a TestImage value

This commit improves TestImage so that an explicit image can trigger
the creation of the container, with optional additional setup. This
removes the need of creating additional container types for images that
have multiple flavors, and to please the static method that can only
create a container based on a single match.

Closes gh-51082
This commit is contained in:
Stéphane Nicoll
2026-09-08 16:46:48 +02:00
parent f956f588d5
commit b1e91c942e
125 changed files with 201 additions and 356 deletions
@@ -52,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class BootBuildImageRegistryIntegrationTests {
@Container
static final RegistryContainer registry = TestImage.container(RegistryContainer.class);
static final RegistryContainer registry = TestImage.forContainer(RegistryContainer.class);
String registryAddress;
@@ -44,7 +44,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class BuildImageRegistryIntegrationTests extends AbstractArchiveIntegrationTests {
@Container
static final RegistryContainer registry = TestImage.container(RegistryContainer.class);
static final RegistryContainer registry = TestImage.forContainer(RegistryContainer.class);
DockerClient dockerClient;
@@ -127,7 +127,7 @@ class ImportTestcontainersTests {
static class ImportWithoutValue {
@ContainerAnnotation
static PostgreSQLContainer container = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer container = TestImage.forContainer(PostgreSQLContainer.class);
}
@@ -151,14 +151,14 @@ class ImportTestcontainersTests {
@ImportTestcontainers
static class NonStaticContainer {
PostgreSQLContainer container = TestImage.container(PostgreSQLContainer.class);
PostgreSQLContainer container = TestImage.forContainer(PostgreSQLContainer.class);
}
interface ContainerDefinitions {
@ContainerAnnotation
PostgreSQLContainer container = TestImage.container(PostgreSQLContainer.class);
PostgreSQLContainer container = TestImage.forContainer(PostgreSQLContainer.class);
}
@@ -170,7 +170,7 @@ class ImportTestcontainersTests {
@ImportTestcontainers
static class ContainerDefinitionsWithDynamicPropertySource {
static PostgreSQLContainer container = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer container = TestImage.forContainer(PostgreSQLContainer.class);
@DynamicPropertySource
static void containerProperties(DynamicPropertyRegistry registry) {
@@ -90,7 +90,7 @@ class TestcontainersImportWithPropertiesInjectedIntoLoadTimeWeaverAwareBeanInteg
static class Containers {
@Container
static PostgreSQLContainer container = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer container = TestImage.forContainer(PostgreSQLContainer.class);
@DynamicPropertySource
static void setConnectionProperties(DynamicPropertyRegistry registry) {
@@ -65,7 +65,7 @@ class TestcontainersLifecycleOrderIntegrationTests {
@Bean
@ServiceConnection
RedisContainer redisContainer() {
return TestImage.container(EventRecordingRedisContainer.class);
return TestImage.forContainer(EventRecordingRedisContainer.class);
}
}
@@ -77,7 +77,7 @@ class TestcontainersLifecycleOrderWithScopeIntegrationTests {
@Scope("custom")
@ServiceConnection
RedisContainer redisContainer() {
return TestImage.container(EventRecordingRedisContainer.class);
return TestImage.forContainer(EventRecordingRedisContainer.class);
}
}
@@ -55,17 +55,17 @@ class TestcontainersParallelStartupIntegrationTests {
@Bean
static PostgreSQLContainer container1() {
return TestImage.container(PostgreSQLContainer.class);
return TestImage.forContainer(PostgreSQLContainer.class);
}
@Bean
static PostgreSQLContainer container2() {
return TestImage.container(PostgreSQLContainer.class);
return TestImage.forContainer(PostgreSQLContainer.class);
}
@Bean
static PostgreSQLContainer container3() {
return TestImage.container(PostgreSQLContainer.class);
return TestImage.forContainer(PostgreSQLContainer.class);
}
}
@@ -52,13 +52,13 @@ class TestcontainersParallelStartupWithImportTestcontainersIntegrationTests {
static class Containers {
@Container
static PostgreSQLContainer container1 = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer container1 = TestImage.forContainer(PostgreSQLContainer.class);
@Container
static PostgreSQLContainer container2 = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer container2 = TestImage.forContainer(PostgreSQLContainer.class);
@Container
static PostgreSQLContainer container3 = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer container3 = TestImage.forContainer(PostgreSQLContainer.class);
}
@@ -67,7 +67,7 @@ class TestcontainersPropertySourceAutoConfigurationTests {
@Bean
RedisContainer redisContainer(DynamicPropertyRegistry properties) {
RedisContainer container = TestImage.container(RedisContainer.class);
RedisContainer container = TestImage.forContainer(RedisContainer.class);
properties.add("container.port", container::getFirstMappedPort);
return container;
}
@@ -81,7 +81,7 @@ class TestcontainersPropertySourceAutoConfigurationTests {
@Bean
RedisContainer redisContainer() {
return TestImage.container(RedisContainer.class);
return TestImage.forContainer(RedisContainer.class);
}
@Bean
@@ -143,7 +143,7 @@ class ServiceConnectionAutoConfigurationTests {
@Bean
@ServiceConnection
PostgreSQLContainer postgresContainer() {
return TestImage.container(PostgreSQLContainer.class);
return TestImage.forContainer(PostgreSQLContainer.class);
}
}
@@ -176,7 +176,7 @@ class ServiceConnectionAutoConfigurationTests {
static class TestcontainersRootBeanDefinition extends RootBeanDefinition implements TestcontainerBeanDefinition {
private final PostgreSQLContainer container = TestImage.container(PostgreSQLContainer.class);
private final PostgreSQLContainer container = TestImage.forContainer(PostgreSQLContainer.class);
TestcontainersRootBeanDefinition() {
setBeanClass(PostgreSQLContainer.class);
@@ -46,7 +46,7 @@ class ServiceConnectionStartsConnectionOnceIntegrationTests {
@Container
@ServiceConnection
static final StartCountingPostgreSQLContainer postgres = TestImage
static final StartCountingPostgreSQLContainer postgres = TestImage.POSTGRESQL
.container(StartCountingPostgreSQLContainer.class);
@Test
@@ -22,6 +22,7 @@ import java.util.List;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import org.testcontainers.activemq.ActiveMQContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -30,7 +31,6 @@ import org.springframework.boot.activemq.autoconfigure.ActiveMQAutoConfiguration
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.jms.autoconfigure.JmsAutoConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.testsupport.container.ActiveMQClassicContainer;
import org.springframework.boot.testsupport.container.TestImage;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -51,7 +51,7 @@ class ActiveMQClassicContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final ActiveMQClassicContainer activemq = TestImage.container(ActiveMQClassicContainer.class);
static final ActiveMQContainer activemq = TestImage.ACTIVE_MQ_CLASSIC.container();
@Autowired
private JmsClient jmsClient;
@@ -22,6 +22,7 @@ import java.util.List;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -30,7 +31,6 @@ import org.springframework.boot.activemq.autoconfigure.ActiveMQAutoConfiguration
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.jms.autoconfigure.JmsAutoConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.testsupport.container.SymptomaActiveMQContainer;
import org.springframework.boot.testsupport.container.TestImage;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -51,7 +51,7 @@ class ActiveMQContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final SymptomaActiveMQContainer activemq = TestImage.container(SymptomaActiveMQContainer.class);
static final GenericContainer<?> activemq = TestImage.ACTIVE_MQ_SYMPTOMA.container();
@Autowired
private JmsClient jmsClient;
@@ -57,7 +57,7 @@ class DeprecatedRabbitContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final RabbitMQContainer rabbit = TestImage.container(RabbitMQContainer.class);
static final RabbitMQContainer rabbit = TestImage.forContainer(RabbitMQContainer.class);
@Autowired(required = false)
private RabbitConnectionDetails connectionDetails;
@@ -54,7 +54,7 @@ class RabbitContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final RabbitMQContainer rabbit = TestImage.container(RabbitMQContainer.class);
static final RabbitMQContainer rabbit = TestImage.forContainer(RabbitMQContainer.class);
@Autowired(required = false)
private RabbitConnectionDetails connectionDetails;
@@ -22,6 +22,7 @@ import java.util.List;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import org.testcontainers.activemq.ArtemisContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -30,7 +31,6 @@ import org.springframework.boot.artemis.autoconfigure.ArtemisAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.jms.autoconfigure.JmsAutoConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.testsupport.container.ArtemisLegacyContainer;
import org.springframework.boot.testsupport.container.TestImage;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -51,7 +51,7 @@ class ArtemisContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final ArtemisLegacyContainer artemis = TestImage.container(ArtemisLegacyContainer.class);
static final ArtemisContainer artemis = TestImage.ARTEMIS_LEGACY.container();
@Autowired
private JmsClient jmsClient;
@@ -50,7 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class RedisCacheMetricsTests {
@Container
static final RedisContainer redis = TestImage.container(RedisContainer.class);
static final RedisContainer redis = TestImage.forContainer(RedisContainer.class);
private static final Tags TAGS = Tags.of("app", "test").and("cache", "test");
@@ -44,7 +44,7 @@ import static org.mockito.Mockito.spy;
class CassandraAutoConfigurationIntegrationTests {
@Container
static final CassandraContainer cassandra = TestImage.container(CassandraContainer.class);
static final CassandraContainer cassandra = TestImage.forContainer(CassandraContainer.class);
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(CassandraAutoConfiguration.class))
@@ -53,7 +53,7 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
class CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests {
@Container
static final CassandraContainer cassandra = TestImage.container(PasswordAuthenticatorCassandraContainer.class)
static final CassandraContainer cassandra = TestImage.forContainer(PasswordAuthenticatorCassandraContainer.class)
.withStartupAttempts(5)
.waitingFor(new CassandraWaitStrategy());
@@ -44,7 +44,7 @@ class CassandraContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final CassandraContainer cassandra = TestImage.container(CassandraContainer.class);
static final CassandraContainer cassandra = TestImage.forContainer(CassandraContainer.class);
@Autowired(required = false)
private CassandraConnectionDetails connectionDetails;
@@ -51,7 +51,7 @@ class CouchbaseAutoConfigurationIntegrationTests {
private static final String BUCKET_NAME = "cbbucket";
@Container
static final CouchbaseContainer couchbase = TestImage.container(CouchbaseContainer.class)
static final CouchbaseContainer couchbase = TestImage.forContainer(CouchbaseContainer.class)
.withEnabledServices(CouchbaseService.KV)
.withCredentials("spring", "password")
.withBucket(new BucketDefinition(BUCKET_NAME).withPrimaryIndex(false));
@@ -46,7 +46,7 @@ class CouchbaseContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final CouchbaseContainer couchbase = TestImage.container(CouchbaseContainer.class)
static final CouchbaseContainer couchbase = TestImage.forContainer(CouchbaseContainer.class)
.withEnabledServices(CouchbaseService.KV, CouchbaseService.INDEX, CouchbaseService.QUERY)
.withBucket(new BucketDefinition("cbbucket"));
@@ -56,7 +56,7 @@ class DataCassandraTestIntegrationTests {
@Container
@ServiceConnection
static final CassandraContainer cassandra = TestImage.container(CassandraContainer.class);
static final CassandraContainer cassandra = TestImage.forContainer(CassandraContainer.class);
@Autowired
private CassandraTemplate cassandraTemplate;
@@ -54,7 +54,7 @@ class DataCassandraTestWithIncludeFilterIntegrationTests {
@Container
@ServiceConnection
static final CassandraContainer cassandra = TestImage.container(CassandraContainer.class);
static final CassandraContainer cassandra = TestImage.forContainer(CassandraContainer.class);
@Autowired
private ExampleRepository exampleRepository;
@@ -47,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class DataCassandraAutoConfigurationIntegrationTests {
@Container
static final CassandraContainer cassandra = TestImage.container(CassandraContainer.class);
static final CassandraContainer cassandra = TestImage.forContainer(CassandraContainer.class);
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(
@@ -52,7 +52,7 @@ class DataCouchbaseTestIntegrationTests {
@Container
@ServiceConnection
static final CouchbaseContainer couchbase = TestImage.container(CouchbaseContainer.class)
static final CouchbaseContainer couchbase = TestImage.forContainer(CouchbaseContainer.class)
.withEnabledServices(CouchbaseService.KV, CouchbaseService.INDEX, CouchbaseService.QUERY)
.withBucket(new BucketDefinition(BUCKET_NAME));
@@ -50,7 +50,7 @@ class DataCouchbaseTestReactiveIntegrationTests {
@Container
@ServiceConnection
static final CouchbaseContainer couchbase = TestImage.container(CouchbaseContainer.class)
static final CouchbaseContainer couchbase = TestImage.forContainer(CouchbaseContainer.class)
.withEnabledServices(CouchbaseService.KV, CouchbaseService.INDEX, CouchbaseService.QUERY)
.withBucket(new BucketDefinition(BUCKET_NAME));
@@ -48,7 +48,7 @@ class DataCouchbaseTestWithIncludeFilterIntegrationTests {
@Container
@ServiceConnection
static final CouchbaseContainer couchbase = TestImage.container(CouchbaseContainer.class)
static final CouchbaseContainer couchbase = TestImage.forContainer(CouchbaseContainer.class)
.withEnabledServices(CouchbaseService.KV, CouchbaseService.INDEX, CouchbaseService.QUERY)
.withBucket(new BucketDefinition("cbbucket"));
@@ -49,7 +49,7 @@ class DataElasticsearchTestIntegrationTests {
@Container
@ServiceConnection
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@@ -44,7 +44,7 @@ class DataElasticsearchTestPropertiesIntegrationTests {
@Container
@ServiceConnection
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
@Autowired
private Environment environment;
@@ -45,7 +45,7 @@ class DataElasticsearchTestReactiveIntegrationTests {
@Container
@ServiceConnection
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
@Autowired
private ReactiveElasticsearchTemplate elasticsearchTemplate;
@@ -46,7 +46,7 @@ class DataElasticsearchTestWithIncludeFilterIntegrationTests {
@Container
@ServiceConnection
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
@Autowired
private ExampleRepository exampleRepository;
@@ -45,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class DataElasticsearchAutoConfigurationIntegrationTests {
@Container
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.ELASTICSEARCH.container();
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class,
@@ -51,7 +51,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class DataElasticsearchReactiveRepositoriesAutoConfigurationTests {
@Container
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ElasticsearchClientAutoConfiguration.class,
@@ -49,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class DataElasticsearchRepositoriesAutoConfigurationTests {
@Container
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class,
@@ -68,7 +68,7 @@ class DataJdbcRepositoriesAutoConfigurationDialectResolutionTests {
private <C extends JdbcDatabaseContainer<?>> void withContainer(Class<C> containerType,
ThrowingConsumer<ApplicationContextRunner> callback) {
C container = TestImage.container(containerType);
C container = TestImage.forContainer(containerType);
try {
container.start();
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
@@ -46,7 +46,8 @@ class DataLdapTestDockerTests {
@Container
@ServiceConnection
static final OpenLdapContainer openLdap = TestImage.container(OpenLdapContainer.class).withEnv("LDAP_TLS", "false");
static final OpenLdapContainer openLdap = TestImage.forContainer(OpenLdapContainer.class)
.withEnv("LDAP_TLS", "false");
@Autowired
private ApplicationContext applicationContext;
@@ -49,7 +49,7 @@ class DataMongoTestIntegrationTests {
@Container
@ServiceConnection
static final MongoDBContainer mongoDb = TestImage.container(MongoDBContainer.class);
static final MongoDBContainer mongoDb = TestImage.forContainer(MongoDBContainer.class);
@Autowired
private MongoTemplate mongoTemplate;
@@ -44,7 +44,7 @@ class DataMongoTestReactiveIntegrationTests {
@Container
@ServiceConnection
static final MongoDBContainer mongoDb = TestImage.container(MongoDBContainer.class);
static final MongoDBContainer mongoDb = TestImage.forContainer(MongoDBContainer.class);
@Autowired
private ReactiveMongoTemplate mongoTemplate;
@@ -43,7 +43,7 @@ class DataMongoTestWithIncludeFilterIntegrationTests {
@Container
@ServiceConnection
static final MongoDBContainer mongoDb = TestImage.container(MongoDBContainer.class);
static final MongoDBContainer mongoDb = TestImage.forContainer(MongoDBContainer.class);
@Autowired
private ExampleService service;
@@ -48,7 +48,7 @@ class TransactionalDataMongoTestIntegrationTests {
@Container
@ServiceConnection
static final MongoDBContainer mongoDb = TestImage.container(MongoDBContainer.class).withReplicaSet();
static final MongoDBContainer mongoDb = TestImage.forContainer(MongoDBContainer.class).withReplicaSet();
@Autowired
private ExampleRepository exampleRepository;
@@ -51,7 +51,7 @@ class DataNeo4jTestIntegrationTests {
@Container
@ServiceConnection
static final Neo4jContainer neo4j = TestImage.container(Neo4jContainer.class);
static final Neo4jContainer neo4j = TestImage.forContainer(Neo4jContainer.class);
@Autowired
private Neo4jTemplate neo4jTemplate;
@@ -44,7 +44,7 @@ class DataNeo4jTestPropertiesIntegrationTests {
@Container
@ServiceConnection
static final Neo4jContainer neo4j = TestImage.container(Neo4jContainer.class).withoutAuthentication();
static final Neo4jContainer neo4j = TestImage.forContainer(Neo4jContainer.class).withoutAuthentication();
@Autowired
private Environment environment;
@@ -57,7 +57,7 @@ class DataNeo4jTestReactiveIntegrationTests {
@Container
@ServiceConnection
static final Neo4jContainer neo4j = TestImage.container(Neo4jContainer.class).withoutAuthentication();
static final Neo4jContainer neo4j = TestImage.forContainer(Neo4jContainer.class).withoutAuthentication();
@Autowired
private ReactiveNeo4jTemplate neo4jTemplate;
@@ -44,7 +44,7 @@ class DataNeo4jTestWithIncludeFilterIntegrationTests {
@Container
@ServiceConnection
static final Neo4jContainer neo4j = TestImage.container(Neo4jContainer.class).withoutAuthentication();
static final Neo4jContainer neo4j = TestImage.forContainer(Neo4jContainer.class).withoutAuthentication();
@Autowired
private ExampleService service;
@@ -44,7 +44,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class Neo4jRepositoriesAutoConfigurationIntegrationTests {
@Container
static final Neo4jContainer neo4j = TestImage.container(Neo4jContainer.class);
static final Neo4jContainer neo4j = TestImage.forContainer(Neo4jContainer.class);
@DynamicPropertySource
static void neo4jProperties(DynamicPropertyRegistry registry) {
@@ -52,7 +52,7 @@ class DataRedisTestIntegrationTests {
@Container
@ServiceConnection
static RedisContainer redis = TestImage.container(RedisContainer.class);
static RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@Autowired
private RedisOperations<Object, Object> operations;
@@ -44,7 +44,7 @@ class DataRedisTestPropertiesIntegrationTests {
@Container
@ServiceConnection
static final RedisContainer redis = TestImage.container(RedisContainer.class);
static final RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@Autowired
private Environment environment;
@@ -48,7 +48,7 @@ class DataRedisTestReactiveIntegrationTests {
@Container
@ServiceConnection
static RedisContainer redis = TestImage.container(RedisContainer.class);
static RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@Autowired
private ReactiveRedisOperations<Object, Object> operations;
@@ -43,7 +43,7 @@ class DataRedisTestWithIncludeFilterIntegrationTests {
@Container
@ServiceConnection
static final RedisContainer redis = TestImage.container(RedisContainer.class);
static final RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@Autowired
private ExampleRepository exampleRepository;
@@ -45,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class DataRedisRepositoriesAutoConfigurationTests {
@Container
public static RedisContainer redis = TestImage.container(RedisContainer.class);
public static RedisContainer redis = TestImage.forContainer(RedisContainer.class);
private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
@@ -45,7 +45,7 @@ class RedisContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final RedisContainer redis = TestImage.container(RedisContainer.class);
static final RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@Autowired(required = false)
private DataRedisConnectionDetails connectionDetails;
@@ -46,7 +46,7 @@ class RedisStackContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final RedisStackContainer redis = TestImage.container(RedisStackContainer.class);
static final RedisStackContainer redis = TestImage.forContainer(RedisStackContainer.class);
@Autowired(required = false)
private DataRedisConnectionDetails connectionDetails;
@@ -46,7 +46,7 @@ class RedisStackServerContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final RedisStackServerContainer redis = TestImage.container(RedisStackServerContainer.class);
static final RedisStackServerContainer redis = TestImage.forContainer(RedisStackServerContainer.class);
@Autowired(required = false)
private DataRedisConnectionDetails connectionDetails;
@@ -41,7 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class ElasticsearchClientAutoConfigurationIntegrationTests {
@Container
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class,
@@ -46,7 +46,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class ElasticsearchRestClientAutoConfigurationIntegrationTests {
@Container
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
static final ElasticsearchContainer elasticsearch = TestImage.forContainer(ElasticsearchContainer.class);
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class));
@@ -31,7 +31,7 @@ import org.springframework.boot.elasticsearch.autoconfigure.ElasticsearchClientA
import org.springframework.boot.elasticsearch.autoconfigure.ElasticsearchConnectionDetails;
import org.springframework.boot.elasticsearch.autoconfigure.ElasticsearchRestClientAutoConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.testsupport.container.ElasticsearchContainer9;
import org.springframework.boot.testsupport.container.TestImage;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@@ -48,8 +48,8 @@ class ElasticsearchContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer9().withStartupAttempts(5)
.withStartupTimeout(Duration.ofMinutes(10));
static final ElasticsearchContainer elasticsearch = TestImage.ELASTICSEARCH_9
.container((setup) -> setup.withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)));
@Autowired(required = false)
private ElasticsearchConnectionDetails connectionDetails;
@@ -46,7 +46,7 @@ class FlywayContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final PostgreSQLContainer postgres = TestImage.container(PostgreSQLContainer.class);
static final PostgreSQLContainer postgres = TestImage.forContainer(PostgreSQLContainer.class);
@Autowired(required = false)
private JdbcConnectionDetails connectionDetails;
@@ -51,7 +51,7 @@ class CustomClusterNameHazelcastContainerConnectionDetailsFactoryIntegrationTest
@Container
@ServiceConnection
static final HazelcastContainer hazelcast = TestImage.container(HazelcastContainer.class)
static final HazelcastContainer hazelcast = TestImage.forContainer(HazelcastContainer.class)
.withClusterName("spring-boot");
@Autowired(required = false)
@@ -47,7 +47,7 @@ class HazelcastContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final HazelcastContainer hazelcast = TestImage.container(HazelcastContainer.class);
static final HazelcastContainer hazelcast = TestImage.forContainer(HazelcastContainer.class);
@Autowired(required = false)
private HazelcastConnectionDetails connectionDetails;
@@ -50,7 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class AutoConfigureTestDatabaseDynamicPropertySourceIntegrationTests {
@Container
static PostgreSQLContainer postgres = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer postgres = TestImage.forContainer(PostgreSQLContainer.class);
@Autowired
private DataSource dataSource;
@@ -52,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class AutoConfigureTestDatabaseNonTestDatabaseIntegrationTests {
@Container
static PostgreSQLContainer postgres = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer postgres = TestImage.forContainer(PostgreSQLContainer.class);
@Autowired
private DataSource dataSource;
@@ -51,7 +51,7 @@ class AutoConfigureTestDatabaseServiceConnectionIntegrationTests {
@Container
@ServiceConnection
static PostgreSQLContainer postgres = TestImage.container(PostgreSQLContainer.class);
static PostgreSQLContainer postgres = TestImage.forContainer(PostgreSQLContainer.class);
@Autowired
private DataSource dataSource;
@@ -48,7 +48,7 @@ class JdbcContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final PostgreSQLContainer postgres = TestImage.container(PostgreSQLContainer.class);
static final PostgreSQLContainer postgres = TestImage.forContainer(PostgreSQLContainer.class);
@Autowired(required = false)
private JdbcConnectionDetails connectionDetails;
@@ -56,7 +56,7 @@ class ApacheKafkaContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final KafkaContainer kafka = TestImage.container(KafkaContainer.class);
static final KafkaContainer kafka = TestImage.forContainer(KafkaContainer.class);
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@@ -55,7 +55,7 @@ class ConfluentKafkaContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final ConfluentKafkaContainer kafka = TestImage.container(ConfluentKafkaContainer.class);
static final ConfluentKafkaContainer kafka = TestImage.forContainer(ConfluentKafkaContainer.class);
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@@ -53,7 +53,7 @@ class RedpandaContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final RedpandaContainer redpanda = TestImage.container(RedpandaContainer.class);
static final RedpandaContainer redpanda = TestImage.forContainer(RedpandaContainer.class);
@Autowired
KafkaTemplate<String, String> kafkaTemplate;
@@ -47,7 +47,7 @@ class LLdapContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final LLdapContainer lldap = TestImage.container(LLdapContainer.class);
static final LLdapContainer lldap = TestImage.forContainer(LLdapContainer.class);
@Autowired
private LdapTemplate ldapTemplate;
@@ -47,7 +47,8 @@ class OpenLdapContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final OpenLdapContainer openLdap = TestImage.container(OpenLdapContainer.class).withEnv("LDAP_TLS", "false");
static final OpenLdapContainer openLdap = TestImage.forContainer(OpenLdapContainer.class)
.withEnv("LDAP_TLS", "false");
@Autowired
private LdapTemplate ldapTemplate;
@@ -46,7 +46,7 @@ class LiquibaseContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final PostgreSQLContainer postgres = TestImage.container(PostgreSQLContainer.class);
static final PostgreSQLContainer postgres = TestImage.forContainer(PostgreSQLContainer.class);
@Autowired(required = false)
private JdbcConnectionDetails connectionDetails;
@@ -92,7 +92,7 @@ class MailSenderAutoConfigurationIntegrationTests {
class ImplicitTlsTests {
@Container
private static final MailpitContainer mailpit = TestImage.container(MailpitContainer.class)
private static final MailpitContainer mailpit = TestImage.forContainer(MailpitContainer.class)
.withSmtpRequireTls(true)
.withSmtpTlsCert(MountableFile
.forClasspathResource("/org/springframework/boot/mail/autoconfigure/ssl/test-server.crt"))
@@ -153,7 +153,7 @@ class MailSenderAutoConfigurationIntegrationTests {
class StarttlsTests {
@Container
private static final MailpitContainer mailpit = TestImage.container(MailpitContainer.class)
private static final MailpitContainer mailpit = TestImage.forContainer(MailpitContainer.class)
.withSmtpRequireStarttls(true)
.withSmtpTlsCert(MountableFile
.forClasspathResource("/org/springframework/boot/mail/autoconfigure/ssl/test-server.crt"))
@@ -55,7 +55,7 @@ class GrafanaOpenTelemetryMetricsContainerConnectionDetailsFactoryIntegrationTes
@Container
@ServiceConnection
static final LgtmStackContainer container = TestImage.container(LgtmStackContainer.class);
static final LgtmStackContainer container = TestImage.forContainer(LgtmStackContainer.class);
@Autowired
private MeterRegistry meterRegistry;
@@ -67,10 +67,10 @@ class OpenTelemetryMetricsContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final GenericContainer<?> container = TestImage.OTEL_COLLECTOR.genericContainer()
.withCommand("--config=/etc/" + CONFIG_FILE_NAME)
.withCopyToContainer(MountableFile.forClasspathResource(CONFIG_FILE_NAME), "/etc/" + CONFIG_FILE_NAME)
.withExposedPorts(4318, 9090);
static final GenericContainer<?> container = TestImage.OTEL_COLLECTOR
.container((setup) -> setup.withCommand("--config=/etc/" + CONFIG_FILE_NAME)
.withCopyToContainer(MountableFile.forClasspathResource(CONFIG_FILE_NAME), "/etc/" + CONFIG_FILE_NAME)
.withExposedPorts(4318, 9090));
@Autowired
private MeterRegistry meterRegistry;
@@ -44,7 +44,7 @@ class GrafanaOpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTes
@Container
@ServiceConnection
static final LgtmStackContainer container = TestImage.container(LgtmStackContainer.class);
static final LgtmStackContainer container = TestImage.forContainer(LgtmStackContainer.class);
@Autowired
private OtlpTracingConnectionDetails connectionDetails;
@@ -44,8 +44,8 @@ class OpenTelemetryTracingContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final GenericContainer<?> container = TestImage.OTEL_COLLECTOR.genericContainer()
.withExposedPorts(4317, 4318);
static final GenericContainer<?> container = TestImage.OTEL_COLLECTOR
.container((setup) -> setup.withExposedPorts(4317, 4318));
@Autowired
private OtlpTracingConnectionDetails connectionDetails;
@@ -45,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class MongoHealthIndicatorIntegrationTests {
@Container
static MongoDBContainer mongo = TestImage.container(MongoDBContainer.class);
static MongoDBContainer mongo = TestImage.forContainer(MongoDBContainer.class);
@Test
void standardApi() {
@@ -47,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class MongoReactiveHealthIndicatorIntegrationTests {
@Container
static MongoDBContainer mongo = TestImage.container(MongoDBContainer.class);
static MongoDBContainer mongo = TestImage.forContainer(MongoDBContainer.class);
@Test
void standardApi() {
@@ -45,7 +45,7 @@ class DeprecatedMongoDbContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final MongoDBContainer mongoDb = TestImage.container(MongoDBContainer.class);
static final MongoDBContainer mongoDb = TestImage.forContainer(MongoDBContainer.class);
@Autowired(required = false)
private MongoConnectionDetails connectionDetails;
@@ -42,7 +42,7 @@ class MongoDbAtlasLocalContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final MongoDBAtlasLocalContainer mongoDb = TestImage.container(MongoDBAtlasLocalContainer.class);
static final MongoDBAtlasLocalContainer mongoDb = TestImage.forContainer(MongoDBAtlasLocalContainer.class);
@Autowired(required = false)
private MongoConnectionDetails connectionDetails;
@@ -53,7 +53,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class Neo4jAutoConfigurationIntegrationTests {
@Container
private static final Neo4jContainer neo4j = TestImage.container(Neo4jContainer.class);
private static final Neo4jContainer neo4j = TestImage.forContainer(Neo4jContainer.class);
@SpringBootTest
@Nested
@@ -49,7 +49,7 @@ class Neo4jReactiveHealthIndicatorIntegrationTests {
// gh-33428
@Container
private static final Neo4jContainer neo4jServer = TestImage.container(Neo4jContainer.class);
private static final Neo4jContainer neo4jServer = TestImage.forContainer(Neo4jContainer.class);
@DynamicPropertySource
static void neo4jProperties(DynamicPropertyRegistry registry) {
@@ -45,7 +45,7 @@ class DeprecatedNeo4jContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final Neo4jContainer<?> container = TestImage.container(Neo4jContainer.class);
static final Neo4jContainer<?> container = TestImage.forContainer(Neo4jContainer.class);
@Autowired(required = false)
private Neo4jConnectionDetails connectionDetails;
@@ -44,7 +44,7 @@ class GrafanaOtlpLoggingContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final LgtmStackContainer container = TestImage.container(LgtmStackContainer.class);
static final LgtmStackContainer container = TestImage.forContainer(LgtmStackContainer.class);
@Autowired
private OtlpLoggingConnectionDetails connectionDetails;
@@ -44,8 +44,8 @@ class OtelCollectorOltpLoggingContainerConnectionDetailsFactoryTests {
@Container
@ServiceConnection
static final GenericContainer<?> container = TestImage.OTEL_COLLECTOR.genericContainer()
.withExposedPorts(4317, 4318);
static final GenericContainer<?> container = TestImage.OTEL_COLLECTOR
.container((setup) -> setup.withExposedPorts(4317, 4318));
@Autowired
private OtlpLoggingConnectionDetails connectionDetails;
@@ -49,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class PulsarAutoConfigurationIntegrationTests {
@Container
static final PulsarContainer pulsar = TestImage.container(PulsarContainer.class);
static final PulsarContainer pulsar = TestImage.forContainer(PulsarContainer.class);
private static final CountDownLatch listenLatch = new CountDownLatch(1);
@@ -57,7 +57,7 @@ class DeprecatedPulsarContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
@SuppressWarnings("unused")
static final PulsarContainer pulsar = TestImage.container(PulsarContainer.class);
static final PulsarContainer pulsar = TestImage.forContainer(PulsarContainer.class);
@Autowired
private PulsarTemplate<String> pulsarTemplate;
@@ -53,7 +53,7 @@ class PulsarContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
@SuppressWarnings("unused")
static final PulsarContainer pulsar = TestImage.container(PulsarContainer.class);
static final PulsarContainer pulsar = TestImage.forContainer(PulsarContainer.class);
@Autowired
private PulsarTemplate<String> pulsarTemplate;
@@ -47,7 +47,7 @@ class OracleFreeR2dbcContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final OracleContainer oracle = TestImage.container(OracleContainer.class);
static final OracleContainer oracle = TestImage.forContainer(OracleContainer.class);
@Autowired
ConnectionFactory connectionFactory;
@@ -51,7 +51,7 @@ class OracleXeR2dbcContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final OracleContainer oracle = TestImage.container(OracleContainer.class);
static final OracleContainer oracle = TestImage.forContainer(OracleContainer.class);
@Autowired
ConnectionFactory connectionFactory;
@@ -60,7 +60,7 @@ import static org.assertj.core.api.Assertions.entry;
class SessionDataRedisAutoConfigurationTests extends AbstractSessionAutoConfigurationTests {
@Container
public static RedisContainer redis = TestImage.container(RedisContainer.class);
public static RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@BeforeEach
void prepareContextRunner() {
@@ -64,7 +64,7 @@ import static org.assertj.core.api.Assertions.entry;
class SessionDataRedisReactiveAutoConfigurationTests extends AbstractSessionReactiveAutoConfigurationTests {
@Container
public static RedisContainer redis = TestImage.container(RedisContainer.class);
public static RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@BeforeEach
void prepareRunner() {
@@ -45,7 +45,7 @@ class ZipkinContainerConnectionDetailsFactoryIntegrationTests {
@Container
@ServiceConnection
static final GenericContainer<?> zipkin = TestImage.container(ZipkinContainer.class);
static final GenericContainer<?> zipkin = TestImage.forContainer(ZipkinContainer.class);
@Autowired(required = false)
private ZipkinConnectionDetails connectionDetails;
@@ -21,6 +21,7 @@ import java.time.Duration;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.testcontainers.activemq.ActiveMQContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -29,7 +30,6 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.testsupport.container.ActiveMQClassicContainer;
import org.springframework.boot.testsupport.container.TestImage;
import static org.assertj.core.api.Assertions.assertThat;
@@ -47,7 +47,7 @@ class SampleActiveMqTests {
@Container
@ServiceConnection
private static final ActiveMQClassicContainer container = TestImage.container(ActiveMQClassicContainer.class);
private static final ActiveMQContainer container = TestImage.ACTIVE_MQ_CLASSIC.container();
@Autowired
private Producer producer;
@@ -49,7 +49,7 @@ class SampleAmqpSimpleApplicationSslTests {
@ServiceConnection
@PemKeyStore(certificate = "classpath:ssl/test-client.crt", privateKey = "classpath:ssl/test-client.key")
@PemTrustStore("classpath:ssl/test-ca.crt")
static final SecureRabbitMqContainer rabbit = TestImage.container(SecureRabbitMqContainer.class);
static final SecureRabbitMqContainer rabbit = TestImage.forContainer(SecureRabbitMqContainer.class);
@Autowired
private Sender sender;
@@ -41,7 +41,7 @@ class SampleAmqpSimpleApplicationTests {
@Container
@ServiceConnection
static final RabbitMQContainer rabbit = TestImage.container(RabbitMQContainer.class);
static final RabbitMQContainer rabbit = TestImage.forContainer(RabbitMQContainer.class);
@Autowired
private Sender sender;
@@ -21,6 +21,7 @@ import java.time.Duration;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.testcontainers.activemq.ArtemisContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -29,7 +30,6 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.testsupport.container.ArtemisLegacyContainer;
import org.springframework.boot.testsupport.container.TestImage;
import static org.assertj.core.api.Assertions.assertThat;
@@ -47,7 +47,7 @@ class SampleArtemisTests {
@Container
@ServiceConnection
private static final ArtemisLegacyContainer container = TestImage.container(ArtemisLegacyContainer.class);
static final ArtemisContainer container = TestImage.ARTEMIS_LEGACY.container();
@Autowired
private Producer producer;
@@ -40,7 +40,7 @@ class SampleCacheApplicationRedisTests {
@Container
@ServiceConnection
private static final RedisContainer redis = TestImage.container(RedisContainer.class);
private static final RedisContainer redis = TestImage.forContainer(RedisContainer.class);
@Autowired
private CacheManager cacheManager;
@@ -52,7 +52,7 @@ class SampleDataCassandraApplicationReactiveSslTests {
@ServiceConnection
@JksTrustStore(location = "classpath:ssl/test-ca.p12", password = "password")
@JksKeyStore(location = "classpath:ssl/test-client.p12", password = "password")
static final SecureCassandraContainer cassandra = TestImage.container(SecureCassandraContainer.class);
static final SecureCassandraContainer cassandra = TestImage.forContainer(SecureCassandraContainer.class);
@Autowired
private ReactiveCassandraTemplate cassandraTemplate;
@@ -52,7 +52,7 @@ class SampleDataCassandraApplicationSslTests {
@ServiceConnection
@JksTrustStore(location = "classpath:ssl/test-ca.p12", password = "password")
@JksKeyStore(location = "classpath:ssl/test-client.p12", password = "password")
static final SecureCassandraContainer cassandra = TestImage.container(SecureCassandraContainer.class);
static final SecureCassandraContainer cassandra = TestImage.forContainer(SecureCassandraContainer.class);
@Autowired
private CassandraTemplate cassandraTemplate;
@@ -49,7 +49,7 @@ class SampleDataCouchbaseApplicationReactiveSslTests {
@ServiceConnection
@PemKeyStore(certificate = "classpath:ssl/test-client.crt", privateKey = "classpath:ssl/test-client.key")
@PemTrustStore(certificate = "classpath:ssl/test-ca.crt")
static final CouchbaseContainer couchbase = TestImage.container(SecureCouchbaseContainer.class)
static final CouchbaseContainer couchbase = TestImage.forContainer(SecureCouchbaseContainer.class)
.withBucket(new BucketDefinition(BUCKET_NAME));
@Autowired

Some files were not shown because too many files have changed in this diff Show More