gpt4 book ai didi

quarkus - 如何在 Quarkus 中以编程方式覆盖应用程序属性

转载 作者:行者123 更新时间:2023-12-04 01:18:03 26 4
gpt4 key购买 nike

我最近开始在我的 Quarkus 网络应用程序中使用 testcontantainers 进行单元/集成测试数据库操作。它工作正常,除了我想不出在 quarkus.datasource.url 应用程序属性中动态设置 MySQL 端口的方法。目前我正在使用已弃用的 withPortBindings 方法强制容器将暴露的 MySQL 端口绑定(bind)到端口 11111 但正确的方法是让 testcontainers 随机选择一个并覆盖quarkus.datasource.url 属性。

我的单元测试课

    @Testcontainers
@QuarkusTest
public class UserServiceTest {
@Container
private static final MySQLContainer MY_SQL_CONTAINER = (MySQLContainer) new MySQLContainer()
.withDatabaseName("userServiceDb")
.withUsername("foo")
.withPassword("bar")
.withUrlParam("serverTimezone", "UTC")
.withExposedPorts(3306)
.withCreateContainerCmdModifier(cmd ->
((CreateContainerCmd) cmd).withHostName("localhost")
.withPortBindings(new PortBinding(Ports.Binding.bindPort(11111), new ExposedPort(3306))) // deprecated, let testcontainers pick random free port
);

@BeforeAll
public static void setup() {
// TODO: use the return value from MY_SQL_CONTAINER.getJdbcUrl()
// to set %test.quarkus.datasource.url
LOGGER.info(" ********************** jdbc url = {}", MY_SQL_CONTAINER.getJdbcUrl());
}
// snip...
}

我的应用程序.properties:

%test.quarkus.datasource.url=jdbc:mysql://localhost:11111/userServiceDb?serverTimezone=UTC
%test.quarkus.datasource.driver=com.mysql.cj.jdbc.Driver
%test.quarkus.datasource.username=foo
%test.quarkus.datasource.password=bar
%test.quarkus.hibernate-orm.dialect=org.hibernate.dialect.MySQL8Dialect

Quarkus guide to configuring an app描述如何以编程方式读取应用程序属性:

String databaseName = ConfigProvider.getConfig().getValue("database.name", String.class);

但不知道如何设置。 This tutorial关于将测试容器与 Quarkus 一起使用暗示它应该是可能的:

//不应使用以下 - 函数已弃用,为了简化测试,您应该在运行时覆盖您的属性

解决方案:正如接受的答案中所建议的,我不必在数据源属性中指定主机和端口。所以解决方案就是简单地替换application.properties中的两行:

%test.quarkus.datasource.url=jdbc:mysql://localhost:11111/userServiceDb
%test.quarkus.datasource.driver=com.mysql.cj.jdbc.Driver

%test.quarkus.datasource.url=jdbc:tc:mysql:///userServiceDb
%test.quarkus.datasource.driver=org.testcontainers.jdbc.ContainerDatabaseDriver

(并删除不必要的 withExposedPortswithCreateContainerCmdModifier 方法调用)

最佳答案

请仔细阅读文档。端口可以​​省略。

https://www.testcontainers.org/modules/databases/jdbc/

关于quarkus - 如何在 Quarkus 中以编程方式覆盖应用程序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62993741/

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