我正在try 定义一个在所有集成测试之前执行一次的@TestConfiguration
类,以便在Spring Boot项目中运行Kotlin中的MongoDB TestContainer.
以下是代码:
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.test.context.DynamicPropertyRegistry
import org.springframework.test.context.DynamicPropertySource
import org.testcontainers.containers.MongoDBContainer
import org.testcontainers.utility.DockerImageName
@TestConfiguration
class TestContainerMongoConfig {
companion object {
@JvmStatic
private val MONGO_CONTAINER: MongoDBContainer = MongoDBContainer(DockerImageName.parse("mongo").withTag("latest")).withReuse(true)
@JvmStatic
@DynamicPropertySource
private fun emulatorProperties(registry: DynamicPropertyRegistry) {
registry.add("spring.data.mongodb.uri", MONGO_CONTAINER::getReplicaSetUrl)
}
init { MONGO_CONTAINER.start() }
}
}
问题似乎是emulatorProperties
方法没有被调用.
常规流程应该是启动容器,然后设置属性.
第一步会发生,第二步不会.
我知道有一个替代方案,我可以在每个功能测试类中进行此配置,但我不喜欢它,因为它会向测试类添加不需要的噪音.
例如,对于使用Postgres的Java项目,我设法使其与以下代码一起工作:
import javax.sql.DataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.utility.DockerImageName;
@TestConfiguration
public class PostgresqlTestContainersConfig {
static final PostgreSQLContainer POSTGRES_CONTAINER;
private final static DockerImageName IMAGE = DockerImageName.parse("postgres").withTag("latest");
static {
POSTGRES_CONTAINER = new PostgreSQLContainer(IMAGE);
POSTGRES_CONTAINER.start();
}
@Bean
DataSource dataSource() {
return DataSourceBuilder.create()
.username(POSTGRES_CONTAINER.getUsername())
.password(POSTGRES_CONTAINER.getPassword())
.driverClassName(POSTGRES_CONTAINER.getDriverClassName())
.url(POSTGRES_CONTAINER.getJdbcUrl())
.build();
}
}
我正在try 实现相同的功能,但使用的是Kotlin和MongoDB.
你知道是什么原因导致@DynamicPropertySource
人没被叫到吗?