强制 Spring Boot 覆盖默认配置
我正在尝试实现使用 Testcontainers 作为项目上 IT 测试的替代方案,目前该项目使用 H2 作为测试数据源,问题是无论我尝试什么,我都会无法覆盖这些配置以便使用数据库容器创建自定义数据源,到目前为止我已经尝试过:
- 直接在 application-testcontainers.yml 文件上设置数据源属性 + @ActiveProfiles("testcontainers") 注释。
spring:
datasource:
url: jdbc:postgresql://localhost:5432/testcontainers
username: user
password: 123456
@RunWith(MockitoJUnitRunner.class)
@ActiveProfiles("testcontainers")
public final class MyTestClass {
}
- 创建扩展类以设置数据源属性(覆盖 beforeAll 方法):
public class TestcontainersExtension implements BeforeAllCallback, AfterAllCallback {
private PostgreSQLContainer<?> container;
@Override
public void beforeAll(ExtensionContext context) throws Exception {
container = new PostgreSQLContainer<>("postgres:9.4")
.withDatabaseName("testcontainers")
.withUsername("user")
.withPassword("123456")
.withExposedPorts(5432);
container.start();
System.setProperty("spring.datasource.url", container.getJdbcUrl());
System.setProperty("spring.datasource.username", container.getUsername());
System.setProperty("spring.datasource.password", container.getPassword());
}
@Override
public void afterAll(ExtensionContext context) throws Exception {
}
}
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(TestcontainersExtension.class)
public final class MyTestClass {
}
- 使用 @DynamicPropertySource 方法动态设置配置属性
@RunWith(MockitoJUnitRunner.class)
MyTestClass {
@Container
static PostgreSQLContainer<?> container =
new PostgreSQLContainer<>("postgres:9.4")
.withDatabaseName("testcontainers")
.withUsername("user")
.withPassword("123456")
.withExposedPorts(5432);
@DynamicPropertySource
static void setTestProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", () -> container.getJdbcUrl());
registry.add("spring.datasource.username", () -> container.getUsername());
registry.add("spring.datasource.password", () -> container.getPassword());
}
}
- @ContextConfiguration< /strong> + 一个初始值设定项类,还尝试动态设置属性
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(initializers = {MyTestClass.Initializer.class})
public final class MyTestClass {
@Container
static PostgreSQLContainer<?> container =
new PostgreSQLContainer<>("postgres:9.4")
.withDatabaseName("testcontainers")
.withUsername("user")
.withPassword("123456")
.withExposedPorts(5432);
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertyValues.of(
"spring.datasource.url=" + container.getJdbcUrl(),
"spring.datasource.username=" + container.getUsername(),
"spring.datasource.password=" + container.getPassword()
).applyTo(applicationContext.getEnvironment());
}
}
}
以上内容都不适合我,我将不胜感激任何提示或替代方案。
I'm trying to implement the usage of Testcontainers as an alternative for IT test on a project, currently the project it's using H2 as datasource for testing, the matter is that no matter what I try I'm not able to override those configurations in order to create a custom datasource by using a DB container, what I've tried so far:
- Setting the datasource attributes directly on the application-testcontainers.yml file + @ActiveProfiles("testcontainers") annotation.
spring:
datasource:
url: jdbc:postgresql://localhost:5432/testcontainers
username: user
password: 123456
@RunWith(MockitoJUnitRunner.class)
@ActiveProfiles("testcontainers")
public final class MyTestClass {
}
- Creating an extension class in order to set the datasource attributes (overriding the beforeAll method):
public class TestcontainersExtension implements BeforeAllCallback, AfterAllCallback {
private PostgreSQLContainer<?> container;
@Override
public void beforeAll(ExtensionContext context) throws Exception {
container = new PostgreSQLContainer<>("postgres:9.4")
.withDatabaseName("testcontainers")
.withUsername("user")
.withPassword("123456")
.withExposedPorts(5432);
container.start();
System.setProperty("spring.datasource.url", container.getJdbcUrl());
System.setProperty("spring.datasource.username", container.getUsername());
System.setProperty("spring.datasource.password", container.getPassword());
}
@Override
public void afterAll(ExtensionContext context) throws Exception {
}
}
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(TestcontainersExtension.class)
public final class MyTestClass {
}
- Using @DynamicPropertySource method in order to set the configuration properties dynamically
@RunWith(MockitoJUnitRunner.class)
MyTestClass {
@Container
static PostgreSQLContainer<?> container =
new PostgreSQLContainer<>("postgres:9.4")
.withDatabaseName("testcontainers")
.withUsername("user")
.withPassword("123456")
.withExposedPorts(5432);
@DynamicPropertySource
static void setTestProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", () -> container.getJdbcUrl());
registry.add("spring.datasource.username", () -> container.getUsername());
registry.add("spring.datasource.password", () -> container.getPassword());
}
}
- @ContextConfiguration + an initializer class, also trying to set the properties dynamically
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(initializers = {MyTestClass.Initializer.class})
public final class MyTestClass {
@Container
static PostgreSQLContainer<?> container =
new PostgreSQLContainer<>("postgres:9.4")
.withDatabaseName("testcontainers")
.withUsername("user")
.withPassword("123456")
.withExposedPorts(5432);
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertyValues.of(
"spring.datasource.url=" + container.getJdbcUrl(),
"spring.datasource.username=" + container.getUsername(),
"spring.datasource.password=" + container.getPassword()
).applyTo(applicationContext.getEnvironment());
}
}
}
None of the above worked for me, I’ll appreciate any hint or alternative.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论