小编dav*_*ick的帖子

是否应该允许在Java中将HashSet添加到自身?

根据Java in Set的合同,"不允许集合将自己包含为元素"(来源).但是,对于HashSet of Objects,这是可能的,如下所示:

Set<Object> mySet = new HashSet<>();
mySet.add(mySet);
assertThat(mySet.size(), equalTo(1));
Run Code Online (Sandbox Code Playgroud)

这个断言通过了,但我希望行为是将结果集合为0或抛出异常.我意识到HashSet的底层实现是一个HashMap,但似乎应该在添加元素之前进行相等检查以避免违反该合同,不是吗?

java collections set contract hashset

52
推荐指数
4
解决办法
3372
查看次数

Jacoco 代码覆盖率随着迁移到 Java 11 而下降

我有几个使用 Java 8 构建的 Gradle 项目,在最近将它们转换为使用 Java 11 之后,Jacoco 代码覆盖率报告报告的百分比比以前低得多。在一个项目中,转换后立即,我的覆盖率从 81% 下降到 16%。

我尝试将 Jacoco 插件更新到 0.8.3(官方支持 JDK 11),将 Gradle 更新到 5.4,将 TestNG 更新到 6.14.3(不确定这是否有任何影响;认为使用最新版本不会有什么坏处) )。即使经过这些更改,我上面提到的项目仍有 16% 的覆盖率。我手动检查了一些它报告为 0% 覆盖率的类,发现它们实际上确实有测试覆盖率。

例如,我将此方法添加到我的一个类中:

public String helloWorld(){
        return "hello";
    }
Run Code Online (Sandbox Code Playgroud)

然后我在测试中使用它:

@Test(groups = IntegrationTest.INTEGRATION_GROUP)
    public void testHelloWorld() {
        String helloWorld = authManager.helloWorld();
        assertEquals(helloWorld, "hello");
    }
Run Code Online (Sandbox Code Playgroud)

覆盖率报告为 0:

在此处输入图片说明

如果有帮助,这里是我的 Jacoco Gradle 设置。我正在使用自定义插件来配置它们。

  class ManagedJacocoPlugin implements ManagedPlugin {
  @Override
  void apply(PluginManager pluginManager) {
    pluginManager.apply(JacocoPlugin.class)
  }

  @Override
  void configure(Project project, GradlePluginConfig pluginConfig) {
    def …
Run Code Online (Sandbox Code Playgroud)

java code-coverage jacoco java-11

4
推荐指数
1
解决办法
5375
查看次数

标签 统计

java ×2

code-coverage ×1

collections ×1

contract ×1

hashset ×1

jacoco ×1

java-11 ×1

set ×1