单元测试中的HashSet

Kap*_*psh 6 java junit hashset

我有一堆返回HashSet的方法.我希望我的单元测试检查这些对象的状态,即确认someObject.getName() == "foobar".

但是,无法保证hashset迭代器顺序,因此我的单元测试失败了一些时间.如何为这样的东西编写单元测试?

例如:

@Test
    public void testRowsToBeRead(){
        HashSet<SomeObject> rows = new SomeObject().read();
        assertEquals(19, rows.size());

        for(SomeObject r:rows){
            //How do I confirm contents?
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想我可能很快就会接受答案.

我现在遇到的问题是我已经实现了equals方法,它只检查每个设计对象中的2个字段(它模仿数据库表).但是在我的单元测试中,我想检查所有字段,如描述等,这些不在我的平等中.因此,如果交换了2个字段并且这些字段不在我的equals实现中,那么单元测试会给出误报.

sse*_*ano 5

您可以使用LinkedHashSet哪个保证订单。


hom*_*ome 5

我的做法:

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));
}
Run Code Online (Sandbox Code Playgroud)

要依赖此测试,您可能需要其他单元测试来确认该SomeObject测试equalshashCode方法是否正常工作......

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

如果您想检查不属于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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@Override
public boolean equals(Object other) {
    return this.getField1().equals( ((SomeObject) other).getField1() );
}
Run Code Online (Sandbox Code Playgroud)

毫无疑问,根据您的具体用例,这可能会变得更加复杂。希望这可以帮助...

  • HashSet#equals 不会做同样的事情吗?即, `if (!expcectedRows.equals(rows)) { /* 失败 */ }` (2认同)