将我的 Oraclecontainer 连接到外部数据库(不是本地主机)以进行集成测试 Java/ Springboot

Connect my Oraclecontainer to an external database (not localhost) for integration tests Java/ Springboot

我想通过使用 testcontainers.

更改我的集成测试(使用 oracle 19c 数据库)

因此在本地安装了 docker,在 Docker 桌面上安装了 运行。

在我使用图像 gvenzl/oracle-xe:18.4.0-slim 并在本地 运行 之后。

在我的代码(java & spring 启动之后),我在应用程序中声明了外部数据库连接-integrationTests.properties

app.datasource.url=jdbc:oracle:thin:@//IT-host:1529/DEV_APP
app.datasource.driverClassName=oracle.jdbc.OracleDriver
app.datasource.username=DEMO
app.datasource.password=DEMO

在我的 ServerConfigIntegrationTest 中,我之前有过这段代码

public DataSource specificDatasource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
return dataSource;
    }

所以,我通过

修改了这个配置
@Testcontainers
public class ServerConfigIntegrationTest{
... code 

@Container
    private final OracleContainer oracleContainer = new OracleContainer("gvenzl/oracle-xe:18.4.0-slim")
            .withReuse(true)
            .withPassword("DEMO")
            .withUsername("DEMO")
            .withDatabaseName("DEV_APP")
            .withLogConsumer(new Slf4jLogConsumer(LOGGER));
    @Bean
    @Primary
    public DataSource specificDatasource() {
        oracleContainer.start();
        LOGGER.info("The JDBC URL of the container is: "+ oracleContainer.getJdbcUrl());        
        dataSource.setDriverClassName(oracleContainer.getDriverClassName());        
        dataSource.setUrl(oracleContainer.getJdbcUrl());
        dataSource.setUsername(oracleContainer.getUsername());
        dataSource.setPassword(oracleContainer.getPassword());
        return dataSource;
        }

当我记录 jdbcUrl 时,我有本地主机作为服务器和错误的端口。

如何将我的容器连接到数据库(使用特定主机“IT-host”)?你能帮帮我吗?

当您使用 Testcontainers 时,会创建一个带有数据库的临时 Docker 容器,其生命周期由您的测试通过 Testcontainers 管理。

当您指定时:

@Container
    private final OracleContainer oracleContainer = new OracleContainer("gvenzl/oracle-xe:18.4.0-slim")
            .withReuse(true)
            .withPassword("DEMO")
            .withUsername("DEMO")
            .withDatabaseName("DEV_APP")
            .withLogConsumer(new Slf4jLogConsumer(LOGGER));

Testcontainers JUnit 集成将控制 Docker 容器与数据库的生命周期。还有更多细节here你可以配置它为每个测试或测试创建一个新的数据库class,等等。还有更多的手动控制选项。

容器会将数据库访问所需的内部端口映射到您计算机上的随机高端口,这就是为什么您在 jdbcUrl.

中看到本地主机和高端口的原因

使您 Spring 引导应用程序使用该容器中的数据库的正确方法是使用 DynamicPropertySourcehttps://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/DynamicPropertySource.html

你会这样做:

@DynamicPropertySource
     static void redisProperties(DynamicPropertyRegistry registry) {
         registry.add("spring.datasource.url", oracleContainer::getJdbcUrl);
         registry.add("spring.datasource.username", oracleContainer::getUsername);
         registry.add("spring.datasource.password", oracleContainer::getPassword);
     }

DynamicPropertySource 将配置您的 Spring 启动应用程序以使用容器化数据库进行测试。 在该设置中,您根本不需要集成测试配置或 运行 现有数据库。

您不能对已存在的数据库实例使用 Testcontainers 测试 运行。