如何对 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 没有 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 来设置最多 4 个元素,而不是使用 HashSet
。我希望制作更大的集合或明确使用 HashSet
应该足以使其失败。但仅比较 hashCode
个副本更简单:assertTrue("hashCode not implemented", itemCopy.hashCode == item.hashCode)
。如果失败,则合同已被破坏(假设 itemCopy == item
)。
我发现我在 Maps and Sets 中使用的 (java) class 的某些实例有时无法使用 contains
方法找到。
问题 只是 class 没有实现 "hashCode"(但它有 equals
)。微妙之处在于它实际上大部分时间都有效:我只是在 运行 并发执行某些代码时才发现错误。
我现在的问题是我想做一个单元测试来断言这个 class 可以在 Set/Map 中可靠地使用(即 .contains
有效)但是我无法重现该错误。
正如我所说,几乎所有时间它都有效。我尝试制作一组实例,然后 运行 多次 contains
并行地使用这些实例的副本。但它始终有效。
如果项目 class 没有 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 来设置最多 4 个元素,而不是使用 HashSet
。我希望制作更大的集合或明确使用 HashSet
应该足以使其失败。但仅比较 hashCode
个副本更简单:assertTrue("hashCode not implemented", itemCopy.hashCode == item.hashCode)
。如果失败,则合同已被破坏(假设 itemCopy == item
)。