【问题标题】:Why are our Hamcrest assertions not recognized as valid assertions for rule S2699?为什么我们的 Hamcrest 断言不被识别为规则 S2699 的有效断言?
【发布时间】:2016-11-09 09:58:41
【问题描述】:

我们正在运行带有 Java 插件 3.14 的 Sonarqube 5.5,并通过调用“mvn clean deploy sonar:sonar”的 sonar-maven-plugin 版本 3.0.2 进行分析。

当测试代码包含以下内容时,我们仍然会收到关于缺少 assertThat 的违规“向此测试用例添加至少一个断言”。

import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
[...]
@Test
public void testByClassicCompare() throws InvalidPropertiesFormatException {
    final CompareFilter compareFilter = new CompareFilter("gid", 333,    Operation.LT);
    assertThat(findAll(compareFilter), hasSize(1));
}

findAll() 是测试类中的一个方法。它只是调用一些休眠查找器并返回一个对象集合:

protected Collection<MyObject> findAll(final HbnFilter filter)

更新: 当我们将断言更改为以下内容时,声纳会识别断言。

    assertThat(findAll(compareFilter).size(), eq(1));

【问题讨论】:

  • 什么是“findAll”方法?你在用 maven 分析你的项目吗?如果不是,您如何为分析提供字节码?由于 java 插件 4.0 版(需要 SQ LTS 5.6)对类型推断进行了很多改进,您可以尝试这个版本吗?
  • @benzonico 我根据您的输入更新了问题。虽然提到的项目已经是 java 8,但我们必须将所有其他项目迁移到 java 8,直到我们可以将 SQ 从 5.5 更新到 5.6 LTS
  • Java 8 需要运行分析器和 sonarqube 服务器,但您仍然可以分析不是 java 8 的项目。
  • 请指定 findAll 方法的完整签名。
  • @benzonico 方法签名添加

标签: sonarqube


【解决方案1】:

这里的根本原因是使用了 JUnit 的 assertThat 方法:

import static org.junit.Assert.assertThat;

而不是 Hamcrest 的:

import static org.hamcrest.MatcherAssert.assertThat;

我最近遇到了problem with the same solution

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2021-01-08
    相关资源
    最近更新 更多