Mockito 在 Coverity 中导致误报?

Mockito causes false positives in Coverity?

我们使用 Coverity 来识别 Java 代码中潜在的安全和质量缺陷。在我们的一个单元测试中,我们有一些涉及数据库连接代码的测试:

Connection connection = mock(Connection.class);
Statement statement = mock(Statement.class);
when(connection.createStatement()).thenReturn(statement);

Coverity 抱怨潜在的资源泄漏:

CID 21920: Resource leak (RESOURCE_LEAK)4. leaked_resource: Failing to save or close resource created by connection.createStatement()

我对 Mockito 工作原理的理解是 connection.getStatement() 从未真正被调用,因此没有创建需要稍后关闭的语句。 (这与需要关闭 JDBC 连接的数据库中的典型情况形成对比。)

我的理解对吗?可以说这是来自 Coverity 的虚假报告,是由 getConnection() 在嘲笑语境中的非典型行为引起的吗?如果不是,请指正。

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

在您的代码中,connection.createStatement() 确实被调用,但它不会在 'real' 连接上被调用,该连接将在某处的数据库上创建资源。 Mockito 创建的模拟 Connection 实现仅跟踪该方法已被调用,并且 returns null。稍后,当调用 thenReturn() 方法时,Mockito 可以 link 调用 createStatement() 并将值传递给 thenReturn() 以便 mock Connection 可以 return 当调用 createStatement() 方法时模拟 Statement

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