java - 单元测试中的 HashSet

标签 java junit hashset

我有一堆返回 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/

相关文章:

java - 参数的变量作为参数

java - 如何使用错误响应休息模板处理 200 状态代码?

java - Java 中的边界检查

exception - 如何在 Scala 中使用 JUnit ExpectedException?

java - 测试 Junit 是否捕获到异常

java - HashSet.contains(object) 对于插入后修改的实例返回 false

Java 编译器不同意泛型方法调用的安全性

java - 是否可以在使用 MockMvc 时添加断言消息?

java - 如何在多个集合中找到最受欢迎的元素

C# 集合性能 : Are Hashset<string> and Dictionary<string, IList<int>> 为此目的最快的集合?