【问题标题】:Mockito causes false positives in Coverity?Mockito 在 Coverity 中导致误报?
【发布时间】:2020-03-24 20:14:51
【问题描述】:

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

【问题讨论】:

    标签: jdbc mockito coverity resource-leak


    【解决方案1】:

    我想说你的理解不太正确。

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

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

    【讨论】:

    • 这对我来说很有意义。谢谢。如果不将其交付给客户,您就不会将其视为缺陷,这是对的。 Coverity 允许指定类似的理由来消除误报。 OTOH,我在尝试运行测试套件时了解到资源泄漏如何导致最终失败,我想确认我的想法,这实际上不是资源泄漏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多