java - 如何对类进行单元测试以检查它是否可以在 Set 或 Map 中使用(即 contains 始终有效)

标签 java scala unit-testing set contains

我发现我在 map 和集合中使用的 (java) 类的某些实例有时无法使用 contains 方法找到。

问题是简单,该类没有实现“hashCode”(但它有equals)。微妙之处在于它实际上在大多数情况下都有效:我只是在运行一些并发代码时才发现错误。

我现在的问题是,我想进行一个单元测试,断言此类可以在 Set/Map 中可靠地使用(即 .contains 有效),但我无法重现漏洞。

正如我所说,几乎所有时候它都有效。我尝试创建一组由几个实例组成的集合,然后并行运行多次 contains 这些实例的副本。但它总是有效。

如果 item 类没有 hashCode,那么 mySet.contains(item-copy) 的哪些测试肯定会失败?

下面是当 MyItem 没有实现 hashCode 时不会失败的测试伪代码:

def testFindInSet(): Unit ={
  val items = Seq(---list of args---).map( args => new MyItem(args)}.toSet
  items.par.foreach{ item =>
    (1 to 100).par.foreach{ k =>
      val itemCopy = new MyItem(item)  // that's a copy constructor
      assertTrue("item not found", items.contains(itemCopy))
    }
  }
}

最佳答案

I tried to make a Set of a couple of instances

Scala 有 specialized representations for 设置最多 4 个元素,而不是使用 HashSet。我希望制作一个更大的集合或显式使用 HashSet 应该足以使其失败。但比较简单的是比较副本的 hashCode:assertTrue("hashCode not Implemented", itemCopy.hashCode == item.hashCode)。如果失败,则合约已被破坏(假设 itemCopy == item)。

关于java - 如何对类进行单元测试以检查它是否可以在 Set 或 Map 中使用(即 contains 始终有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904734/

相关文章:

java - 如何将 Java 方法的回调放入 React Native 中的文本中

scala - 将 build.sbt 与 project/Build.scala 和聚合混合

c++ - 如何使用 googletest 捕获标准输出/标准错误?

java - String 不被视为对象吗?

java - 如何获取 Java 中另一个应用程序抛出的异常?

Scala 代码分析器的目标是与外部匹配变量相同的案例变量名称 - "suspicous shadowing"

scala - 由于某种原因无法从 RejectedExecutionException 中恢复

angular - Angular 中 Istanbul 尔覆盖率报告中的标记异常

java - SOAPUI 转移属性(property)

java - 在 jME 3 中将四边形添加到几何体时出现空指针异常