From 54c83f108052b84b3504c3ccd1cde14af9be886e Mon Sep 17 00:00:00 2001 From: Baqirrizvidev <114152937+Baqirrizvidev@users.noreply.github.com> Date: Sat, 13 Jun 2026 23:17:08 +0530 Subject: [PATCH] feat(jdbc): Add getR2dbcUrl helper method to JdbcDatabaseContainer #8797 --- .../containers/JdbcDatabaseContainer.java | 17 ++++++++ .../containers/JdbcDatabaseContainerTest.java | 43 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index cf6c995528f..520b2bc269d 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -76,6 +76,23 @@ public JdbcDatabaseContainer(final DockerImageName dockerImageName) { */ public abstract String getJdbcUrl(); + /** + * @return a R2DBC URL that may be used to connect to the dockerized DB + */ + public String getR2dbcUrl() { + String jdbcUrl = getJdbcUrl(); + if (jdbcUrl == null) { + return null; + } + if (jdbcUrl.startsWith("jdbc:sqlserver:")) { + return jdbcUrl.replace("jdbc:sqlserver:", "r2dbc:mssql:"); + } + if (jdbcUrl.startsWith("jdbc:oracle:thin:@")) { + return jdbcUrl.replace("jdbc:oracle:thin:@", "r2dbc:oracle://"); + } + return jdbcUrl.replace("jdbc:", "r2dbc:"); + } + /** * @return the database name */ diff --git a/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java b/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java index ca41c3f5d1c..d51faae72b2 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java @@ -7,11 +7,54 @@ import java.sql.Connection; import java.sql.SQLException; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.mockito.Mockito.mock; class JdbcDatabaseContainerTest { + @Test + void testGetR2dbcUrlWithDifferentJdbcUrls() { + // Null URL + JdbcDatabaseContainer nullUrlContainer = new JdbcDatabaseContainerStub("mysql:latest") { + @Override + public String getJdbcUrl() { + return null; + } + }; + assertThat(nullUrlContainer.getR2dbcUrl()).isNull(); + + // Standard postgres URL + JdbcDatabaseContainer postgresContainer = new JdbcDatabaseContainerStub("postgres:latest") { + @Override + public String getJdbcUrl() { + return "jdbc:postgresql://localhost:5432/testdb"; + } + }; + assertThat(postgresContainer.getR2dbcUrl()) + .isEqualTo("r2dbc:postgresql://localhost:5432/testdb"); + + // MSSQL server URL + JdbcDatabaseContainer mssqlContainer = new JdbcDatabaseContainerStub("mssql:latest") { + @Override + public String getJdbcUrl() { + return "jdbc:sqlserver://localhost:1433;databaseName=testdb"; + } + }; + assertThat(mssqlContainer.getR2dbcUrl()) + .isEqualTo("r2dbc:mssql://localhost:1433;databaseName=testdb"); + + // Oracle server URL + JdbcDatabaseContainer oracleContainer = new JdbcDatabaseContainerStub("oracle:latest") { + @Override + public String getJdbcUrl() { + return "jdbc:oracle:thin:@localhost:1521/xepdb1"; + } + }; + assertThat(oracleContainer.getR2dbcUrl()) + .isEqualTo("r2dbc:oracle://localhost:1521/xepdb1"); + } + @Test void anExceptionIsThrownIfJdbcIsNotAvailable() { JdbcDatabaseContainer jdbcContainer = new JdbcDatabaseContainerStub("mysql:latest")