Java 如何对类进行单元测试,以检查它是否可以在集合或映射中使用(即包含始终有效)
我发现我在映射和集合中使用的(java)类的某些实例有时无法使用Java 如何对类进行单元测试,以检查它是否可以在集合或映射中使用(即包含始终有效),java,scala,unit-testing,set,contains,Java,Scala,Unit Testing,Set,Contains,我发现我在映射和集合中使用的(java)类的某些实例有时无法使用contains方法找到 问题很简单,这个类没有实现“hashCode”(但它有等于)。微妙的是,它实际上大部分时间都在工作:我只是在并发运行某些代码时才发现错误 我现在的问题是,我想做一个单元测试,断言这个类可以在Set/Map中可靠地使用(也就是说,.contains可以工作),但是我不能重现这个bug 正如我所说的,几乎所有的时间它都是有效的。我尝试创建一组实例,然后使用这些实例的副本并行运行多次contains。但它总是有效
contains
方法找到
问题很简单,这个类没有实现“hashCode”(但它有等于)。微妙的是,它实际上大部分时间都在工作:我只是在并发运行某些代码时才发现错误
我现在的问题是,我想做一个单元测试,断言这个类可以在Set/Map中可靠地使用(也就是说,.contains
可以工作),但是我不能重现这个bug
正如我所说的,几乎所有的时间它都是有效的。我尝试创建一组实例,然后使用这些实例的副本并行运行多次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))
}
}
}
我试着做了一系列的例子
Scala有最多4个元素的for设置,而不是使用HashSet
。我希望创建一个更大的集合或显式地使用HashSet
应该足以使它失败。但是比较副本的hashCode
更简单:assertTrue(“hashCode未实现”,itemCopy.hashCode==item.hashCode)
。如果失败,则合同已经破裂(假设itemCopy==item
)。就是这样。我测试了超过4个项目,如果少于4个项目,则使用HashMap进行测试,并且错误被复制。狡猾的