2016-08-31 8 views
2

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.

+0

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

Antwort

0

Die getConnection erwirbt Verbindung vom zugrunde liegenden Pool. Ändern Sie Ihre Tests, um die erfasste Verbindung wie folgt richtig zu schließen:

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

Ich werde diese Antwort akzeptieren, da sie tatsächlich das Problem löst. Ich habe jedoch auch Tests mit Federdaten-Repositories (http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories). Repositorys stellen die zugrunde liegende Verbindung nicht zur Verfügung. Irgendwelche Vorschläge, wie man diese aufräumt? –

+0

@dilbertelbonia-Repositories, die von spring bereitgestellt werden, schließen Verbindungen automatisch durch zugrunde liegende Abstraktionen (JPA, Hiberante und Platform Transaction Manager) – miensol