我有一个字符串对的类。这个类实现了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;
这对我不起作用。
答案 0 :(得分:1)
您的StringNumber
课程需要equals()
方法。然后它会工作。假设此类包含string
和number
字段(由我的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()
。
equals()
时,必须实施hashCode()
。这里不需要,但最好是安全而不是抱歉:What issues should be considered when overriding equals and hashCode in Java?。