gpt4 book ai didi

java - 单元测试中的 HashSet

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:12 25 4
gpt4 key购买 nike

我有一堆返回 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));
}

要依赖此测试,您可能需要其他单元测试来确认 SomeObjectequalshashCode 方法正常工作。 ..

根据您的一条评论进行编辑

如果要检查不属于 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
}
}
}

在上面的例子中 SomeObjectequals 可能看起来像这样,它只检查 field1:

@Override
public boolean equals(Object other) {
return this.getField1().equals( ((SomeObject) other).getField1() );
}

没问题,这可能会变得更加复杂,具体取决于您的具体用例。希望这有助于...

关于java - 单元测试中的 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7042067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com