web-dev-qa-db-ja.com

SpringBootと接続プールを使用したデータベーステスト

データベースに接続するアプリのテストを作成しようとしています。 DataSourceは接続プール(Hikari)です。

これが私のテスト構成です:

@Configuration
public class SqlTestConfig {

    @Bean
    DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setMaximumPoolSize(2);
        config.setDriverClassName("com.Microsoft.sqlserver.jdbc.SQLServerDriver");
        config.setJdbcUrl("jdbc:sqlserver://serversql:1433;database=myDatabase");
        config.setUsername("user");
        config.setPassword("password");
        return new HikariDataSource(config);
    }
}

これが私のテストクラスです:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SqlTestConfig.class)
@Slf4j
@Sql(
        scripts = "/clearTables.sql",
        config = @SqlConfig(separator = "GO")
)
public class SqlTest {

    @Autowired
    DataSource dataSource;

    @Test
    public void test1() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }

    @Test
    public void test2() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }

    @Test
    public void test3() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }

    @Test
    public void test4() throws SQLException {
        log.info("catalog:" + dataSource.getConnection().getCatalog());
    }
}

MaximumPoolSizeが2に設定されていることに注意してください。テストクラスを実行すると、最初の2つのテストが正常に完了し、プールの接続がなくなる(接続タイムアウト)ため、残りのテストは失敗します。

問題は、クリーンアップスクリプトを実行するためにDataSourceInitializer -sが作成される@Sqlアノテーションが原因であると思いますが、接続がプールに返されることはありません。

MaximumPoolSizeを4に設定すると、すべてのテストが正常に完了します。構成エラーが発生したのか、これがSpringのバグなのかわかりません。

6
dilbert elbonia

getConnectionは、基になるプールから接続を取得します。次のように、取得した接続を適切に閉じるようにテストを変更します。

@Test
public void test1() throws SQLException {
    try (Connection connection = dataSource.getConnection()) {
        log.info("catalog:" + connection.getCatalog());
    }
}
2
miensol