TMT*_*MTH 5 java spring integration-testing spring-jdbc spring-boot
我们有使用Postgresql DB的大型系统,具有相当复杂的数据库结构。而且,我们对该系统进行了许多与DB相关的集成测试。由于复杂的数据库结构以及代码中使用postres特定sql的原因,使用H2(或内存DB中的其他数据库)模拟postgres似乎非常不可靠。
因此,我们正在使用具有以下结构的junit测试:
@RunWith(SpringRunner.class)
@JdbcTest
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
@Sql( ... schema creation, sample data, etc  )
@ContextConfiguration(classes = ... dao and service classes used in the test)
Run Code Online (Sandbox Code Playgroud)
当您有2-3个测试课程时,一切都OK。当您有10多个测试课程时,问题就会开始出现。据我了解,SpringBoot为每个不同的上下文配置创建单独的连接池。为了使测试尽可能隔离,我们通常在上下文配置中仅包含测试内部使用的组件。因此,SpringBoot创建了数十个连接池,从而导致连接池或jdbc驱动程序出现“连接过多”类型的错误。您可以一个一个地运行测试,但是不能一次运行所有测试(因此,请与CI告别)。
我们正在使用以下解决方法。以下代码段已复制粘贴到每个测试类:
// <editor-fold name='connection leaking fix'
@Autowired
private DataSource dataSource;
private static HikariDataSource hikariDataSource;
@Before
public void saveDataSource() {
    this.hikariDataSource = (HikariDataSource)dataSource;
}
@AfterClass
public static void releaseDataSource() {
    if (hikariDataSource != null) {
        hikariDataSource.close();
    }
}
// </editor-fold>
Run Code Online (Sandbox Code Playgroud)
它有效,但是您必须记住,您不应粘贴该代码段来测试使用相同上下文配置的类。
问题 -是否有任何方法可以告诉Spring Boot在每个测试类执行后关闭连接池,或者有什么方法可以限制Spring Boot创建的连接池数量?
@M.Deinum 是对的,在不破解某些解决方法的情况下解决问题的唯一方法是使用有限数量的配置。所以你可以使用这样的东西来测试 DAO 层:
@RunWith(SpringRunner.class)
@JdbcTest(includeFilters = @ComponentScan.Filter(Repository.class))
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
@Sql(...)
Run Code Online (Sandbox Code Playgroud)
或者像这样来测试 DAO 和服务层:
@RunWith(SpringRunner.class)
@JdbcTest(includeFilters = {
    @ComponentScan.Filter(Repository.class),
    @ComponentScan.Filter(Service.class)
})
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
@Sql(...)
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1548 次  |  
        
|   最近记录:  |