【问题标题】:Spring testcontainers Driver org.testcontainers.jdbc.ContainerDatabaseDriver claims to not accept jdbcUrlSpring testcontainers Driver org.testcontainers.jdbc.ContainerDatabaseDriver 声称不接受 jdbcUrl
【发布时间】:2020-08-05 07:04:37
【问题描述】:

为我的集成测试进行以下配置后,我遇到了以下异常:

Driver org.testcontainers.jdbc.ContainerDatabaseDriver claims to not accept jdbcUrl, jdbc:postgresql://localhost:32864/test?loggerLevel=OFF

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = WebApplication.class)
@AutoConfigureMockMvc
@Testcontainers
@TestPropertySource(ResourceUtils.CLASSPATH_URL_PREFIX + "application-test.properties")
public abstract class AbstractIntegrationTest {

    @Autowired
    protected MockMvc mockMvc;

    @Container
    protected static PostgreSQLContainer<?> postgresqlContainer = new PostgreSQLContainer<>();

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

    @Test
    void contextLoads() {
        Assertions.assertThat(mockMvc).isNotNull();
        Assertions.assertThat(postgresqlContainer.isRunning()).isTrue();
    }
}

postgresqlContainer.getJdbcUrl() 返回jdbc:postgresql://localhost:32864/test?loggerLevel=OFF 但它应该返回 jdbc:tc:postgresql://...,它缺少 tc 部分。

有什么解决办法吗?

像这样硬编码:String.format("jdbc:tc:postgresql://localhost:%s/%s", postgresqlContainer.getFirstMappedPort(), postgresqlContainer.getDatabaseName()) 似乎可行。

我在这里做错了什么?

【问题讨论】:

    标签: spring spring-boot integration-testing testcontainers


    【解决方案1】:

    请在此处查看大橙色警告: https://www.testcontainers.org/modules/databases/jdbc/

    您应该使用带有 tc: 前缀和 ContainerDatabaseDriver 的 JDBC URL 或带有 getJdbcUrl() 和原始驱动程序的容器实例(或让系统为您检测驱动程序),而不是两者都使用。

    【讨论】:

      【解决方案2】:

      在我的例子中,只是添加了 postgresql 依赖项(它包括驱动程序)并且它起作用了:

      <dependency>
          <groupId>org.postgresql</groupId>
          <artifactId>postgresql</artifactId>
          <version>42.3.0</version>
      </dependency>
      

      我的测试课:

      import org.junit.Rule;
      import org.junit.Test;
      import org.junit.platform.commons.annotation.Testable;
      import org.testcontainers.containers.PostgreSQLContainer;
      
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.util.logging.Level;
      import java.util.logging.LogManager;
      
      import static org.junit.jupiter.api.Assertions.assertEquals;
      
      @Testable
      public class PostgreSqlContainerLiveTest {
      
          @Rule
          public PostgreSQLContainer postgresContainer = new PostgreSQLContainer("postgres:9.4");
      
          static {
              // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing
              LogManager.getLogManager().getLogger("").setLevel(Level.OFF);
          }
      
          @Test
          public void whenSelectQueryExecuted_thenResultsReturned() throws Exception {
              ResultSet resultSet = performQuery(postgresContainer, "SELECT 1");
              resultSet.next();
              int result = resultSet.getInt(1);
              assertEquals(1, result);
          }
      
          private ResultSet performQuery(PostgreSQLContainer postgreSQLContainer, String query) throws SQLException {
              String jdbcUrl = postgreSQLContainer.getJdbcUrl();
              String username = postgreSQLContainer.getUsername();
              String password = postgreSQLContainer.getPassword();
      
              Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
              return conn.createStatement().executeQuery(query);
          }
      }
      

      我希望这对您或其他人有所帮助。

      【讨论】:

        猜你喜欢
        • 2020-11-02
        • 2020-06-06
        • 1970-01-01
        • 2019-09-26
        • 2021-10-19
        • 2020-10-29
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多