gpt4 book ai didi

java - 为 SpringBootTest 动态添加属性源

转载 作者:行者123 更新时间:2023-11-28 20:07:31 25 4
gpt4 key购买 nike

类似于Springboot unit test set @Configuration Properties dynamically但上下文不同。

在我的例子中,我有一个 TestContainer运行一个预先填充了大量数据的自定义 MySQL 数据库(不使用 SQL 批量加载方法,因为数据是生产的匿名副本,通过 SQL 执行它会使容器的启动时间为 20 分钟,而不是 2 分钟)。

到目前为止我的测试看起来像这样

@RunWith(SpringRunner.class)
@SpringBootTest(
classes = {
Bootstrap.class
}
)
public class ITFakeDB {
@ClassRule
public static final GenericContainer DB = new GenericContainer("devdb")
.withExposedPorts(3306);
@Autowired
private DataSource dataSource;

@Autowired
private Users users;

@Test
public void testDatabaseIsUp() {
assertTrue(DB.getMappedPort(3306) != 0);
}

@Test
public void testUser() {
Optional<User> user = users.findByLoginName("mimi");
assertTrue(users.isPresent());
}
}

我想做的是以某种方式将 spring.datasource.url (或者在我的例子中是 datasources.schema1.url 因为我做了 routing datasource )设置为DB

使用的那个

最佳答案

您可以使用 ContextConfigurationApplicationContextInitializer 在 Spring-boot 测试中手动覆盖该属性。

重写属性——定义一个静态内部类:

  static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
String url = "jdbc:mysql://" + DB.getContainerIpAddress() + ":" + DB.getMappedPort(3306) + "/my_db";

TestPropertyValues
.of("datasources.schema1.url=" + url)
.applyTo(configurableApplicationContext.getEnvironment());
}
}

注意:我假设 url 是从 ip 地址、端口和数据库名称派生的。您可以根据需要更改该部分,但核心思想仍然存在。

ApplicationContextInitializer 可用于在上下文刷新之前以编程方式初始化 Spring 上下文。现在,通过在测试类级别使用 ContextConfiguration 注释来连接上下文初始化器类:

@ContextConfiguration(initializers = Initializer.class)

文档:

ApplicationContextInitializer

ContextConfiguration

关于java - 为 SpringBootTest 动态添加属性源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56200277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com