Ich versuche, Tests für meine App zu erstellen, die eine Verbindung zu einer Datenbank herstellt. Die DataSource ist ein Verbindungspool (Hikari).Spring Boot und Datenbank testen mit Verbindungspool
Hier ist meine Testkonfiguration:
@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);
}
}
Hier ist meine Testklasse ist:
@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());
}
}
Beachten Sie, dass die MaximumPoolSize auf 2 gesetzt ist, wenn ich die Testklasse die ersten beiden Tests ausgeführt sind erfolgreich abgeschlossen, und die restlichen Tests schlagen fehl, da der Pool keine Verbindungen mehr hat (Verbindungstimeout).
Ich glaube, das Problem liegt an der @ Sql Annotation, die DataSourceInitializer -s
erstellt, um das Bereinigungsskript auszuführen, aber die Verbindungen werden nie an den Pool zurückgegeben.
Wenn ich MaximumPoolSize auf 4 gesetzt habe, sind alle Tests erfolgreich abgeschlossen. Ich kann nicht sagen, ob ich einen Konfigurationsfehler gemacht habe oder ob dies ein Fehler im Frühling ist.
Ich kann mit voller Zuversicht sagen, dass Sie einen Fehler gemacht haben; Das Problem ist nicht Spring Boot. Sie sollten versuchen, eine @After-Methode hinzuzufügen, um die Verbindung zu bereinigen und sie nach jedem Test im Pool wiederherzustellen. – duffymo