首页 > 解决方案 > 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()在嘲笑的背景下的非典型行为引起的吗?如果不是,请纠正我。

标签: jdbcmockitocoverityresource-leak

解决方案


我会说你的理解并不完全正确。

在您的代码中,connection.createStatement()确实会被调用,但不会在将在某处的数据库上创建资源的“真实”连接上调用它。Mockito 创建的模拟Connection实现只跟踪该方法已被调用,并返回null。稍后,当thenReturn()调用该方法时,Mockito 可以将调用链接到createStatement()传递给的值,thenReturn()以便模拟可以在调用该方法时Connection返回模拟。StatementcreateStatement()

最终,这是来自 Coverity 的误报:这里没有资源泄漏问题。但是,在测试代码上运行像 Coverity 这样的扫描仪的价值存在问题。特别是,我不确定您如何在测试代码中存在安全漏洞,因为它不是交互式的,也不是您发送给客户或上传到某处服务器的东西。


推荐阅读