jdbc - Mockito 在 Coverity 中导致误报?
问题描述
我们使用 Coverity 来识别 Java 代码中潜在的安全和质量缺陷。在我们的一个单元测试中,我们进行了一些涉及数据库连接代码的测试:
Connection connection = mock(Connection.class);
Statement statement = mock(Statement.class);
when(connection.createStatement()).thenReturn(statement);
Coverity 抱怨潜在的资源泄漏:
CID 21920:资源泄漏 (RESOURCE_LEAK)4。leaked_resource:无法保存或关闭由 connection.createStatement() 创建的资源
我对 Mockito 工作原理的理解是它connection.getStatement()
从未被实际调用过,因此不会创建需要稍后关闭的语句。(这与数据库中需要关闭 JDBC 连接的典型情况形成对比。)
我的理解正确吗?可以公平地说,这是来自 Coverity 的虚假报告,是由于getConnection()
在嘲笑的背景下的非典型行为引起的吗?如果不是,请纠正我。
解决方案
我会说你的理解并不完全正确。
在您的代码中,connection.createStatement()
确实会被调用,但不会在将在某处的数据库上创建资源的“真实”连接上调用它。Mockito 创建的模拟Connection
实现只跟踪该方法已被调用,并返回null
。稍后,当thenReturn()
调用该方法时,Mockito 可以将调用链接到createStatement()
传递给的值,thenReturn()
以便模拟可以在调用该方法时Connection
返回模拟。Statement
createStatement()
最终,这是来自 Coverity 的误报:这里没有资源泄漏问题。但是,在测试代码上运行像 Coverity 这样的扫描仪的价值存在问题。特别是,我不确定您如何在测试代码中存在安全漏洞,因为它不是交互式的,也不是您发送给客户或上传到某处服务器的东西。
推荐阅读
- python - 使用 Postgres 优化 Django 查询集查询
- c - 在动态数组中获取错误数量的元素
- typeorm - TypeORM - 一对多:EntityColumnNotFound:未找到实体列“context.physicalPresets”
- open-source - 如何将 VoiceBase Player UI 代码集成到我的 React 应用程序中
- javascript - 使用 jquery 单击时,html 中的 li 标记不显示任何操作
- java - 使用 Java 服务器流式传输音频的最快方法
- amazon-web-services - 弹性搜索排序
- c++ - Qt 信号和槽。滑块和进度条
- c++ - 使用用户输入创建 json 数据库
- vuejs2 - 使用 vue-cli 2 或 3 声明的项目