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

How to unit test a class to check it can be used in a Set or Map (i.e. contains always works)

我发现我在 Maps and Sets 中使用的 (java) class 的某些实例有时无法使用 contains 方法找到。

问题 只是 class 没有实现 "hashCode"(但它有 equals)。微妙之处在于它实际上大部分时间都有效:我只是在 运行 并发执行某些代码时才发现错误。

我现在的问题是我想做一个单元测试来断言这个 class 可以在 Set/Map 中可靠地使用(即 .contains 有效)但是我无法重现该错误。

正如我所说,几乎所有时间它都有效。我尝试制作一组​​实例,然后 运行 多次 contains 并行地使用这些实例的副本。但它始终有效。

如果项目 class 没有 hashCodemySet.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 来设置最多 4 个元素,而不是使用 HashSet。我希望制作更大的集合或明确使用 HashSet 应该足以使其失败。但仅比较 hashCode 个副本更简单:assertTrue("hashCode not implemented", itemCopy.hashCode == item.hashCode)。如果失败,则合同已被破坏(假设 itemCopy == item)。