Spring Boot JDBC-Test数据库连接泄漏运行所有测试时

时间:2017-11-20 08:01:16

标签: java mysql spring jdbc

我按照以下方式构建了测试。

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {BizServiceTestContextConfig.class})
@JdbcTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@TestPropertySource( {
    "file:${apps.config.root}/test_config/bizservice.test.properties",
    "file:${apps.config.root}/test_config/dcs.test.properties"
})
@PropertySource(name = PropSourceKey.SCHEDULER_PROPERTIES, value = "file:${apps.config.root}/config/scheduler.properties")
@PropertySource(name = PropSourceKey.MESSAGING_PROPERTIES, value = "file:${apps.config.root}/config/messaging.properties")
public abstract class BizServiceTest {

}

对于每个测试类,我已经扩展了这个类以避免代码重复。所以典型的测试类看起来像这样。

public class SystemParameterServiceImplTest extends BizServiceTest {

    @Autowired
    private SystemParameterService systemParameterService;

    @Test
    public void testA() throws Exception {

    }

    @Test
    public void testB() throws Exception {

    }

    @Test
    public void testC() throws Exception {

    }


}

我目前运行了66个测试用例,所有测试用例都连接到预先初始化的MySQL Db Schema,并运行访问该数据库的测试。全部运行在最后回滚的事务上。我面临的问题是,我的所有测试都运行并且不释放数据库连接。所以我写的测试越多,它所持有的数据库连接数就越多。这会产生一种数据库连接泄漏。 enter image description here 我知道在这样的实例中可以增加数据库连接。但它使测试非常不可扩展。我尝试使用@DirtiesContext(classMode = ClassMode.AFTER_CLASS)但没有解决问题。无论如何都要在课后释放数据库连接。

1 个答案:

答案 0 :(得分:0)

我认为我们可能要做的唯一奇怪的事情就是没有对嵌入式数据库的支持,并且没有连接实际的数据库实例来运行测试,这是至关重要的,因为我们的数据模型太复杂而无法模拟或包含在嵌入式数据库中。

就像为每个测试类上下文创建一个连接池,但是一旦类结束就不会释放它。

  

因此,我使用了具体的数据源[Hikari]实现,并明确地   摆脱了@AfterClass池。

此外,由于跨测试的Spring缓存服务实现必须使用@DirtiestContext取消课后类的上下文。现在可以正确释放连接。