Skip to content

Commit 491f34d

Browse files
wilkinsonaphilwebb
andcommitted
Improve container test code
Replace `DockerImageNames` with a enum and relocate it from the `testcontainers` to `container` package. The enum now also becomes a common location that we can use to apply container configuration such as timeouts. Closes gh-41164 Co-authored-by: Phillip Webb <[email protected]>
1 parent 36a504b commit 491f34d

File tree

143 files changed

+827
-854
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

143 files changed

+827
-854
lines changed

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/cache/RedisCacheMetricsTests.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -32,7 +32,8 @@
3232
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
3333
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3434
import org.springframework.boot.test.context.runner.ContextConsumer;
35-
import org.springframework.boot.testsupport.testcontainers.RedisContainer;
35+
import org.springframework.boot.testsupport.container.RedisContainer;
36+
import org.springframework.boot.testsupport.container.TestImage;
3637
import org.springframework.cache.annotation.EnableCaching;
3738
import org.springframework.context.annotation.Configuration;
3839
import org.springframework.data.redis.cache.RedisCache;
@@ -49,7 +50,7 @@
4950
class RedisCacheMetricsTests {
5051

5152
@Container
52-
static final RedisContainer redis = new RedisContainer();
53+
static final RedisContainer redis = TestImage.container(RedisContainer.class);
5354

5455
private static final Tags TAGS = Tags.of("app", "test").and("cache", "test");
5556

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/mongo/MongoHealthIndicatorIntegrationTests.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.actuate.mongo;
1818

19-
import java.time.Duration;
20-
2119
import com.mongodb.ConnectionString;
2220
import com.mongodb.MongoClientSettings;
2321
import com.mongodb.MongoClientSettings.Builder;
@@ -33,7 +31,7 @@
3331
import org.springframework.boot.actuate.data.mongo.MongoHealthIndicator;
3432
import org.springframework.boot.actuate.health.Health;
3533
import org.springframework.boot.actuate.health.Status;
36-
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
34+
import org.springframework.boot.testsupport.container.TestImage;
3735
import org.springframework.data.mongodb.core.MongoTemplate;
3836

3937
import static org.assertj.core.api.Assertions.assertThat;
@@ -47,8 +45,7 @@
4745
class MongoHealthIndicatorIntegrationTests {
4846

4947
@Container
50-
static MongoDBContainer mongo = new MongoDBContainer(DockerImageNames.mongo()).withStartupAttempts(3)
51-
.withStartupTimeout(Duration.ofMinutes(2));
48+
static MongoDBContainer mongo = TestImage.container(MongoDBContainer.class);
5249

5350
@Test
5451
void standardApi() {

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/mongo/MongoReactiveHealthIndicatorIntegrationTests.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.springframework.boot.actuate.data.mongo.MongoReactiveHealthIndicator;
3434
import org.springframework.boot.actuate.health.Health;
3535
import org.springframework.boot.actuate.health.Status;
36-
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
36+
import org.springframework.boot.testsupport.container.TestImage;
3737
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
3838

3939
import static org.assertj.core.api.Assertions.assertThat;
@@ -47,8 +47,7 @@
4747
class MongoReactiveHealthIndicatorIntegrationTests {
4848

4949
@Container
50-
static MongoDBContainer mongo = new MongoDBContainer(DockerImageNames.mongo()).withStartupAttempts(3)
51-
.withStartupTimeout(Duration.ofMinutes(2));
50+
static MongoDBContainer mongo = TestImage.container(MongoDBContainer.class);
5251

5352
@Test
5453
void standardApi() {

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicatorIntegrationTests.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -29,7 +29,7 @@
2929
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3030
import org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration;
3131
import org.springframework.boot.test.context.SpringBootTest;
32-
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
32+
import org.springframework.boot.testsupport.container.TestImage;
3333
import org.springframework.context.annotation.Configuration;
3434
import org.springframework.context.annotation.Import;
3535
import org.springframework.test.context.DynamicPropertyRegistry;
@@ -49,9 +49,7 @@ class Neo4jReactiveHealthIndicatorIntegrationTests {
4949
// gh-33428
5050

5151
@Container
52-
private static final Neo4jContainer<?> neo4jServer = new Neo4jContainer<>(DockerImageNames.neo4j())
53-
.withStartupAttempts(5)
54-
.withStartupTimeout(Duration.ofMinutes(10));
52+
private static final Neo4jContainer<?> neo4jServer = TestImage.container(Neo4jContainer.class);
5553

5654
@DynamicPropertySource
5755
static void neo4jProperties(DynamicPropertyRegistry registry) {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationIntegrationTests.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,14 +19,15 @@
1919
import com.datastax.oss.driver.api.core.CqlSession;
2020
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
2121
import org.junit.jupiter.api.Test;
22+
import org.testcontainers.containers.CassandraContainer;
2223
import org.testcontainers.junit.jupiter.Container;
2324
import org.testcontainers.junit.jupiter.Testcontainers;
2425

2526
import org.springframework.beans.factory.config.BeanPostProcessor;
2627
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2728
import org.springframework.boot.autoconfigure.AutoConfigurations;
2829
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
29-
import org.springframework.boot.testsupport.testcontainers.CassandraContainer;
30+
import org.springframework.boot.testsupport.container.TestImage;
3031
import org.springframework.context.annotation.Bean;
3132
import org.springframework.context.annotation.Configuration;
3233

@@ -43,7 +44,7 @@
4344
class CassandraAutoConfigurationIntegrationTests {
4445

4546
@Container
46-
static final CassandraContainer cassandra = new CassandraContainer();
47+
static final CassandraContainer<?> cassandra = TestImage.container(CassandraContainer.class);
4748

4849
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4950
.withConfiguration(AutoConfigurations.of(CassandraAutoConfiguration.class))

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@
1818

1919
import java.net.InetSocketAddress;
2020
import java.nio.charset.StandardCharsets;
21-
import java.time.Duration;
2221
import java.util.concurrent.TimeUnit;
2322

2423
import com.datastax.oss.driver.api.core.ConsistencyLevel;
@@ -28,16 +27,18 @@
2827
import org.junit.jupiter.api.Test;
2928
import org.rnorth.ducttape.TimeoutException;
3029
import org.rnorth.ducttape.unreliables.Unreliables;
30+
import org.testcontainers.containers.CassandraContainer;
3131
import org.testcontainers.containers.ContainerLaunchException;
3232
import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy;
3333
import org.testcontainers.images.builder.Transferable;
3434
import org.testcontainers.junit.jupiter.Container;
3535
import org.testcontainers.junit.jupiter.Testcontainers;
36+
import org.testcontainers.utility.DockerImageName;
3637

3738
import org.springframework.beans.factory.BeanCreationException;
3839
import org.springframework.boot.autoconfigure.AutoConfigurations;
3940
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
40-
import org.springframework.boot.testsupport.testcontainers.CassandraContainer;
41+
import org.springframework.boot.testsupport.container.TestImage;
4142
import org.springframework.util.StreamUtils;
4243

4344
import static org.assertj.core.api.Assertions.assertThat;
@@ -52,8 +53,9 @@
5253
class CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests {
5354

5455
@Container
55-
static final CassandraContainer cassandra = new PasswordAuthenticatorCassandraContainer().withStartupAttempts(5)
56-
.withStartupTimeout(Duration.ofMinutes(10))
56+
static final PasswordAuthenticatorCassandraContainer cassandra = TestImage
57+
.container(PasswordAuthenticatorCassandraContainer.class)
58+
.withStartupAttempts(5)
5759
.waitingFor(new CassandraWaitStrategy());
5860

5961
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
@@ -83,7 +85,12 @@ void authenticationWithInvalidCredentials() {
8385
.withMessageContaining("Authentication error"));
8486
}
8587

86-
static final class PasswordAuthenticatorCassandraContainer extends CassandraContainer {
88+
static final class PasswordAuthenticatorCassandraContainer
89+
extends CassandraContainer<PasswordAuthenticatorCassandraContainer> {
90+
91+
PasswordAuthenticatorCassandraContainer(DockerImageName dockerImageName) {
92+
super(dockerImageName);
93+
}
8794

8895
@Override
8996
protected void containerIsCreated(String containerId) {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationIntegrationTests.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@
3535

3636
import org.springframework.boot.autoconfigure.AutoConfigurations;
3737
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
38-
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
38+
import org.springframework.boot.testsupport.container.TestImage;
3939

4040
import static org.assertj.core.api.Assertions.assertThat;
4141

@@ -51,11 +51,9 @@ class CouchbaseAutoConfigurationIntegrationTests {
5151
private static final String BUCKET_NAME = "cbbucket";
5252

5353
@Container
54-
static final CouchbaseContainer couchbase = new CouchbaseContainer(DockerImageNames.couchbase())
54+
static final CouchbaseContainer couchbase = TestImage.container(CouchbaseContainer.class)
5555
.withEnabledServices(CouchbaseService.KV)
5656
.withCredentials("spring", "password")
57-
.withStartupAttempts(5)
58-
.withStartupTimeout(Duration.ofMinutes(10))
5957
.withBucket(new BucketDefinition(BUCKET_NAME).withPrimaryIndex(false));
6058

6159
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
1919
import com.datastax.oss.driver.api.core.CqlSession;
2020
import com.datastax.oss.driver.api.core.CqlSessionBuilder;
2121
import org.junit.jupiter.api.Test;
22+
import org.testcontainers.containers.CassandraContainer;
2223
import org.testcontainers.junit.jupiter.Container;
2324
import org.testcontainers.junit.jupiter.Testcontainers;
2425

@@ -28,7 +29,7 @@
2829
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
2930
import org.springframework.boot.autoconfigure.data.cassandra.city.City;
3031
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
31-
import org.springframework.boot.testsupport.testcontainers.CassandraContainer;
32+
import org.springframework.boot.testsupport.container.TestImage;
3233
import org.springframework.context.annotation.Bean;
3334
import org.springframework.context.annotation.Configuration;
3435
import org.springframework.data.cassandra.config.SchemaAction;
@@ -46,7 +47,7 @@
4647
class CassandraDataAutoConfigurationIntegrationTests {
4748

4849
@Container
49-
static final CassandraContainer cassandra = new CassandraContainer();
50+
static final CassandraContainer<?> cassandra = TestImage.container(CassandraContainer.class);
5051

5152
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
5253
.withConfiguration(

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.autoconfigure.data.elasticsearch;
1818

19-
import java.time.Duration;
20-
2119
import org.junit.jupiter.api.Test;
2220
import org.testcontainers.elasticsearch.ElasticsearchContainer;
2321
import org.testcontainers.junit.jupiter.Container;
@@ -32,7 +30,7 @@
3230
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchClientAutoConfiguration;
3331
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration;
3432
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
35-
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
33+
import org.springframework.boot.testsupport.container.TestImage;
3634
import org.springframework.context.annotation.Configuration;
3735
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
3836
import org.springframework.data.elasticsearch.config.EnableElasticsearchAuditing;
@@ -52,10 +50,7 @@
5250
class ElasticsearchRepositoriesAutoConfigurationTests {
5351

5452
@Container
55-
static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer(DockerImageNames.elasticsearch())
56-
.withEnv("ES_JAVA_OPTS", "-Xms32m -Xmx512m")
57-
.withStartupAttempts(5)
58-
.withStartupTimeout(Duration.ofMinutes(10));
53+
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
5954

6055
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
6156
.withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class,

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.autoconfigure.data.elasticsearch;
1818

19-
import java.time.Duration;
20-
2119
import org.junit.jupiter.api.Test;
2220
import org.testcontainers.elasticsearch.ElasticsearchContainer;
2321
import org.testcontainers.junit.jupiter.Container;
@@ -35,7 +33,7 @@
3533
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener;
3634
import org.springframework.boot.logging.LogLevel;
3735
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
38-
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
36+
import org.springframework.boot.testsupport.container.TestImage;
3937
import org.springframework.context.annotation.Configuration;
4038
import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchTemplate;
4139
import org.springframework.data.elasticsearch.config.EnableElasticsearchAuditing;
@@ -55,10 +53,7 @@
5553
class ReactiveElasticsearchRepositoriesAutoConfigurationTests {
5654

5755
@Container
58-
static ElasticsearchContainer elasticsearch = new ElasticsearchContainer(DockerImageNames.elasticsearch())
59-
.withEnv("ES_JAVA_OPTS", "-Xms32m -Xmx512m")
60-
.withStartupAttempts(5)
61-
.withStartupTimeout(Duration.ofMinutes(10));
56+
static final ElasticsearchContainer elasticsearch = TestImage.container(ElasticsearchContainer.class);
6257

6358
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
6459
.withConfiguration(AutoConfigurations.of(ElasticsearchClientAutoConfiguration.class,

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jRepositoriesAutoConfigurationIntegrationTests.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.autoconfigure.data.neo4j;
1818

19-
import java.time.Duration;
20-
2119
import org.junit.jupiter.api.Test;
2220
import org.testcontainers.containers.Neo4jContainer;
2321
import org.testcontainers.junit.jupiter.Container;
@@ -28,7 +26,7 @@
2826
import org.springframework.boot.autoconfigure.data.neo4j.country.CountryRepository;
2927
import org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration;
3028
import org.springframework.boot.test.context.SpringBootTest;
31-
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
29+
import org.springframework.boot.testsupport.container.TestImage;
3230
import org.springframework.context.annotation.Configuration;
3331
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
3432
import org.springframework.test.context.DynamicPropertyRegistry;
@@ -46,15 +44,13 @@
4644
class Neo4jRepositoriesAutoConfigurationIntegrationTests {
4745

4846
@Container
49-
private static final Neo4jContainer<?> neo4jServer = new Neo4jContainer<>(DockerImageNames.neo4j())
50-
.withStartupAttempts(5)
51-
.withStartupTimeout(Duration.ofMinutes(10));
47+
static final Neo4jContainer<?> neo4j = TestImage.container(Neo4jContainer.class);
5248

5349
@DynamicPropertySource
5450
static void neo4jProperties(DynamicPropertyRegistry registry) {
55-
registry.add("spring.neo4j.uri", neo4jServer::getBoltUrl);
51+
registry.add("spring.neo4j.uri", neo4j::getBoltUrl);
5652
registry.add("spring.neo4j.authentication.username", () -> "neo4j");
57-
registry.add("spring.neo4j.authentication.password", neo4jServer::getAdminPassword);
53+
registry.add("spring.neo4j.authentication.password", neo4j::getAdminPassword);
5854
}
5955

6056
@Autowired

0 commit comments

Comments
 (0)