我发现我在 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/