158 lines
3.9 KiB
Markdown
158 lines
3.9 KiB
Markdown
# Testcontainers Configuration
|
|
|
|
## Spring Boot 3.5+ `@ServiceConnection`
|
|
|
|
```java
|
|
@TestConfiguration
|
|
public class TestContainerConfig {
|
|
|
|
@Bean
|
|
@ServiceConnection
|
|
public PostgreSQLContainer<?> postgresContainer() {
|
|
return new PostgreSQLContainer<>(DockerImageName.parse("postgres:16-alpine"))
|
|
.withDatabaseName("testdb")
|
|
.withUsername("test")
|
|
.withPassword("test");
|
|
}
|
|
|
|
@Bean
|
|
@ServiceConnection
|
|
public GenericContainer<?> redisContainer() {
|
|
return new GenericContainer<>(DockerImageName.parse("redis:7-alpine"))
|
|
.withExposedPorts(6379);
|
|
}
|
|
}
|
|
```
|
|
|
|
Apply with `@Import(TestContainerConfig.class)` on test classes.
|
|
|
|
## Traditional `@DynamicPropertySource`
|
|
|
|
```java
|
|
@Testcontainers
|
|
class UserServiceIntegrationTest {
|
|
|
|
@Container
|
|
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
|
|
DockerImageName.parse("postgres:16-alpine"))
|
|
.withDatabaseName("testdb")
|
|
.withUsername("test")
|
|
.withPassword("test");
|
|
|
|
@DynamicPropertySource
|
|
static void configureProperties(DynamicPropertyRegistry registry) {
|
|
registry.add("spring.datasource.url", postgres::getJdbcUrl);
|
|
registry.add("spring.datasource.username", postgres::getUsername);
|
|
registry.add("spring.datasource.password", postgres::getPassword);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Multiple Containers
|
|
|
|
```java
|
|
@Testcontainers
|
|
class MultiContainerIntegrationTest {
|
|
|
|
@Container
|
|
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
|
|
"postgres:16-alpine")
|
|
.withDatabaseName("testdb");
|
|
|
|
@Container
|
|
static GenericContainer<?> redis = new GenericContainer<>(
|
|
"redis:7-alpine")
|
|
.withExposedPorts(6379);
|
|
|
|
@DynamicPropertySource
|
|
static void configureProperties(DynamicPropertyRegistry registry) {
|
|
registry.add("spring.datasource.url", postgres::getJdbcUrl);
|
|
registry.add("spring.redis.host", redis::getHost);
|
|
registry.add("spring.redis.port", redis::getFirstMappedPort);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Container Reuse Strategy
|
|
|
|
```java
|
|
@Testcontainers(disableWithoutDocker = true)
|
|
class ContainerConfig {
|
|
|
|
static final PostgreSQLContainer<?> POSTGRES = new PostgreSQLContainer<>(
|
|
DockerImageName.parse("postgres:16-alpine"))
|
|
.withDatabaseName("testdb")
|
|
.withUsername("test")
|
|
.withPassword("test")
|
|
.withReuse(true);
|
|
|
|
@BeforeAll
|
|
static void startAll() {
|
|
POSTGRES.start();
|
|
}
|
|
|
|
@AfterAll
|
|
static void stopAll() {
|
|
POSTGRES.stop();
|
|
}
|
|
}
|
|
```
|
|
|
|
Enable reuse with environment variable: `TESTCONTAINERS_REUSE_ENABLE=true`
|
|
|
|
## MySQL Container
|
|
|
|
```java
|
|
@Container
|
|
static MySQLContainer<?> mysql = new MySQLContainer<>(
|
|
DockerImageName.parse("mysql:8.0"))
|
|
.withDatabaseName("testdb")
|
|
.withUsername("test")
|
|
.withPassword("test");
|
|
```
|
|
|
|
## MongoDB Container
|
|
|
|
```java
|
|
@Container
|
|
static MongoDBContainer<?> mongodb = new MongoDBContainer<>(
|
|
DockerImageName.parse("mongo:6.0"))
|
|
.withExposedPorts(27017);
|
|
```
|
|
|
|
## Kafka Container
|
|
|
|
```java
|
|
@Container
|
|
static KafkaContainer kafka = new KafkaContainer(
|
|
DockerImageName.parse("confluentinc/cp-kafka:7.5.0"));
|
|
|
|
@DynamicPropertySource
|
|
static void kafkaProperties(DynamicPropertyRegistry registry) {
|
|
registry.add("spring.kafka.bootstrap-servers", kafka::getBootstrapServers);
|
|
}
|
|
```
|
|
|
|
## Container Initialization
|
|
|
|
```java
|
|
@Container
|
|
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
|
|
"postgres:16-alpine")
|
|
.withDatabaseName("testdb")
|
|
.withUsername("test")
|
|
.withPassword("test")
|
|
.withInitScript("sql/init-test.sql") // Run init script
|
|
.withCommand("postgres", "-c", "max_connections=200"); // Custom config
|
|
```
|
|
|
|
## Network Configuration
|
|
|
|
```java
|
|
@Container
|
|
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
|
|
"postgres:16-alpine")
|
|
.withNetwork(Network.SHARED)
|
|
.withNetworkAliases("pgdb"); // Access via hostname
|
|
```
|