Mockito вызывает ложные срабатывания в Coverity? - PullRequest
0 голосов
/ 24 марта 2020

Мы используем Coverity для определения потенциальной безопасности и качества fl aws в нашем 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() фактически никогда не вызывается, и поэтому не создается никакого оператора, который должен быть закрытым позже. (Это отличается от типичного случая в базах данных, где соединение JDB C должно быть закрыто.)

Правильно ли мое понимание? Справедливо ли говорить, что это ложное сообщение от Coverity, вызванное нетипичным поведением getConnection() в контексте насмешек? Если нет, пожалуйста, поправьте меня.

1 Ответ

3 голосов
/ 25 марта 2020

Я бы сказал, что ваше понимание не совсем правильно.

В вашем коде connection.createStatement() вызывается, но не вызывается при "реальном" соединении, которое создаст ресурс в базе данных где-то. Реализация mock Connection, которую Mockito создает только для отслеживания вызова метода и возвращает null. Позже, когда вызывается метод thenReturn(), Mockito может связать вызов с createStatement() со значением, переданным thenReturn(), так что mock Connection может вернуть mock Statement при вызове метода createStatement() на нем.

В конечном счете, это ложное положительное сообщение от Coverity: здесь нет проблемы утечки ресурсов. Однако возникает вопрос о ценности запуска сканера, такого как Coverity, в тестовом коде. В частности, я не уверен, что у вас может быть недостаток безопасности в тестовом коде, учитывая, что он не является интерактивным и не является чем-то, что вы либо отправляете клиентам, либо загружаете на сервер где-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...