使用 @MockBean 的 Spring Boot 集成测试不释放 jdbc 连接

Posted

技术标签:

【中文标题】使用 @MockBean 的 Spring Boot 集成测试不释放 jdbc 连接【英文标题】:Spring Boot Integration Tests With @MockBean don't release jdbc connections 【发布时间】:2018-07-27 03:41:00 【问题描述】:

我对集成测试有疑问。

我们使用的是 spring boot 1.4.4 + spring batch + testcontainers + postgres。

每个集成测试都有注释:

@RunWith(SpringRunner.class)
@ActiveProfiles(value =  "integrationtest" )
@SpringBootTest(classes = ServiceApplication.class)

问题是:

看起来每个包含@MockBean 注解的集成测试都会创建一个新的上下文。 每个新上下文都会创建一个具有 10 个连接的新连接池。 但是之前的上下文并没有释放它的连接。

因此,在进行此类测试之前,我可以从 postgres 中选择连接数:

select sum(numbackends) from pg_stat_database;

并看到每个测试添加了 10 个新连接。

由于 100 个连接限制,第 10 次测试失败。

您能建议如何解决它吗?

【问题讨论】:

您尝试过@DirtiesContext 吗?检查here 你有一些创建连接池的配置吗? 【参考方案1】:

看起来像注释的组合 + 所有@MockBean 类计算某种“哈希”。

每个“散列”都会创建自己的上下文,spring 会缓存它。 每个包含创建自己的连接池,默认有 10 个连接。

虽然所有上下文都被缓存,但所有连接池都保持连接 - 这就是我的问题的原因。

正如 jusermar10 所说,您可以使用 @DirtiesContext 注释修复它。

【讨论】:

以上是关于使用 @MockBean 的 Spring Boot 集成测试不释放 jdbc 连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 @MockBean 的 Spring Boot 集成测试不释放 jdbc 连接

spring单元测试Mock,MockBean踩坑及没有真实执行的理解

@MockBean 不适用于带有 JUnit 5 和 Spring Boot 2 的 @WebMvcTest?

为啥弹簧测试失败,不起作用@MockBean

spring-boo hello world程序

[@ MockBean和@Autowired在一个测试类中使用同一服务