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..07a6bc1e973 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -77,8 +77,21 @@ public JdbcDatabaseContainer(final DockerImageName dockerImageName) { public abstract String getJdbcUrl(); /** - * @return the database name + * @return a R2DBC URL that may be used to connect to the dockerized DB */ + public String getR2dbcUrl() { + String jdbcUrl = getJdbcUrl(); + if (!jdbcUrl.startsWith("jdbc:")) { + throw new IllegalStateException("JDBC URL does not start with 'jdbc:': " + jdbcUrl); + } + return "r2dbc:" + jdbcUrl.substring(5); + } + + + + /** + * @return the database name + */ public String getDatabaseName() { throw new UnsupportedOperationException(); } 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..c9e7e82ff4a 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java @@ -20,6 +20,32 @@ void anExceptionIsThrownIfJdbcIsNotAvailable() { assertThatExceptionOfType(IllegalStateException.class).isThrownBy(jdbcContainer::waitUntilContainerStarted); } + @Test + void getR2dbcUrlReturnsR2dbcPrefixedUrl() { + JdbcDatabaseContainer jdbcContainer = new JdbcDatabaseContainerStub("mysql:latest") { + @Override + public String getJdbcUrl() { + return "jdbc:mysql://localhost:3306/test"; + } + }; + + String r2dbcUrl = jdbcContainer.getR2dbcUrl(); + assert r2dbcUrl.equals("r2dbc:mysql://localhost:3306/test"); + } + + @Test + void getR2dbcUrlThrowsExceptionIfJdbcPrefixMissing() { + JdbcDatabaseContainer jdbcContainer = new JdbcDatabaseContainerStub("mysql:latest") { + @Override + public String getJdbcUrl() { + return "mysql://localhost:3306/test"; + } + }; + + assertThatExceptionOfType(IllegalStateException.class) + .isThrownBy(jdbcContainer::getR2dbcUrl); + } + static class JdbcDatabaseContainerStub extends JdbcDatabaseContainer { public JdbcDatabaseContainerStub(@NonNull String dockerImageName) {