我有一堆返回 HashSet 的方法。我希望我的单元测试能够检查这些对象的状态,即确认 someObject.getName() == "foobar"
。
然而,哈希集迭代器的顺序无法保证,因此我的单元测试有时会失败。我该如何为这样的事情编写单元测试?
例如:
@Test
public void testRowsToBeRead(){
HashSet<SomeObject> rows = new SomeObject().read();
assertEquals(19, rows.size());
for(SomeObject r:rows){
//How do I confirm contents?
}
}
我想我可能过早接受了答案。
我现在遇到的问题是我已经实现了 equals 方法,每个设计只检查对象中的 2 个字段(它模仿数据库表)。 但是在我的单元测试中,我想检查所有不在我的字段中的字段,如描述等。因此,如果 2 个字段被交换并且这些字段不在我的 equals 实现中,那么单元测试会给出误报。
最佳答案
我的方法:
public void testRowsToBeRead(){
HashSet<SomeObject> expectedRows = new HasSet<SomeObject();
expectedRows.add(new SomeObject("abc"));
expectedRows.add(new SomeObject("def"));
HashSet<SomeObject> rows = new SomeObject().read();
// alternative 1
assertEquals(19, rows.size());
for(SomeObject r:rows){
if (!expectedRows.contains(r)) {
// test failed
}
}
// alternative 2
assertTrue(expectedRows.equals(rows));
}
要依赖此测试,您可能需要其他单元测试来确认 SomeObject
的 equals
和 hashCode
方法正常工作。 ..
根据您的一条评论进行编辑
如果要检查不属于 equals
协定的字段,则必须遍历集合:
public void testRowsToBeRead(){
HashSet<SomeObject> expectedRows = new HasSet<SomeObject();
expectedRows.add(new SomeObject("a", "a1"));
expectedRows.add(new SomeObject("b", "b1"));
HashSet<SomeObject> rows = new SomeObject().read();
for(SomeObject r : rows) {
SomeObject expected = expectedRows.get(r); // equals and hashCode must still match
if (expected == null) {
// failed
}
if (!expected.getField1().equals(r.getField1()) && !expected.getField2().equals(r.getField2())) {
// failed
}
}
}
在上面的例子中 SomeObject
的 equals
可能看起来像这样,它只检查 field1
:
@Override
public boolean equals(Object other) {
return this.getField1().equals( ((SomeObject) other).getField1() );
}
没问题,这可能会变得更加复杂,具体取决于您的具体用例。希望这有助于...
关于java - 单元测试中的 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7042067/