具有非原始模板参数的集合的AssertEquals

时间:2011-11-13 16:28:29

标签: java templates collections junit

我有一个字符串对的类。这个类实现了compareTo方法。

另一个类的方法返回该对类型的元素集合。

我想对此方法执行单元测试,因此编写了以下内容:

@Test
public void testWeight() {

    Collection<StringNumber<BigDecimal>> expected = new Vector<StringNumber<BigDecimal>>();
    expected.add(new StringNumber<BigDecimal>("a", BigDecimal.ONE));
    expected.add(new StringNumber<BigDecimal>("b", BigDecimal.ONE));

    Collection<StringNumber<BigDecimal>> actual = new Vector<StringNumber<BigDecimal>>();
    expected.add(new StringNumber<BigDecimal>("a", BigDecimal.ONE));
    expected.add(new StringNumber<BigDecimal>("b", BigDecimal.ONE));

    //Collection<StringNumber<BigDecimal>> actual = A.f();

    assertEquals(expected, actual);
}

但正如您所看到的,即使集合中的元素相同,断言也会失败。可能是什么原因?

我得到的错误是

  

java.lang.AssertionError:expected:java.util.Vector&lt; [a:1,b:1]&gt;                              但是:java.util.Vector&lt; [a:1,b:1]&gt;

这对我不起作用。

1 个答案:

答案 0 :(得分:1)

您的StringNumber课程需要equals()方法。然后它会工作。假设此类包含stringnumber字段(由我的IDE自动生成):

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof StringNumber)) {
        return false;
    }
    StringNumber that = (StringNumber) o;
    if (number != null ? !number.equals(that.number) : that.number != null) {
        return false;
    }
    return !(string != null ? !string.equals(that.string) : that.string != null);

}

@Override
public int hashCode() {
    int result = string != null ? string.hashCode() : 0;
    result = 31 * result + (number != null ? number.hashCode() : 0);
    return result;
}

几点评论:

  • 两个Vector(你为什么使用这种古老的数据结构)是平等的if
  

两个[...]具有相同的大小,并且两个列表中所有对应的元素对相等。 (如果e1,则两个元素e2(e1==null ? e2==null : e1.equals(e2))相等。)

这就是为什么需要覆盖equals()