Java 为什么这个断言会抛出断言错误?
为任务创建测试时,我得到一个奇怪的Java 为什么这个断言会抛出断言错误?,java,junit,hamcrest,Java,Junit,Hamcrest,为任务创建测试时,我得到一个奇怪的AssertionError异常 我已经改变了它,直到我得到一个简单的案例: List<Integer> elements= new ArrayList<Integer>(); elements.add(1); elements.add(2); elements.add(3); Permutation p2 = new Permutation(elements); Permutation p1 = new Permutation(ele
AssertionError
异常
我已经改变了它,直到我得到一个简单的案例:
List<Integer> elements= new ArrayList<Integer>();
elements.add(1);
elements.add(2);
elements.add(3);
Permutation p2 = new Permutation(elements);
Permutation p1 = new Permutation(elements);
assertThat(p2, equalTo(p1));
其中arg应为“p2”,对象应为“p1”
(可在以下网址浏览)
使用调试器检查的areEqual方法中的比较结果如下:
"p2 == null" false
"p1 != null" true
"p2.getClass().isArray()" false
"p2.equals(p1)" true
"equalTo(p1).matches(p2)" false
如您所见,代码应该达到最后一个else条件并返回true
(p2.equals(p1)
),但equalTo(p1)。matches(p2)
返回false
感谢您的帮助为什么希望
p2.equals(p1)
返回true
?您没有在置换
类中重写等于
,因此默认情况下它将使用引用标识。通常,您需要覆盖equals
(和hashCode
,以匹配equals),以表明在置换时,相等的含义
编辑:现在你已经发布了更多的代码,事情就更清楚了。您的equals方法具有以下签名:
public boolean equals(Permutacion permutation){
这不会覆盖Object.equals
,匹配器将使用它。相反,它重载了它-引入了一个新方法,这就是调试器检查中调用的方法。如果你写:
Object o1 = p1;
然后,p2.equals(o1)
也将在调试器中显示false
——这就是匹配器的实际操作。您的equals方法应该如下所示:
@Override
public boolean equals(Object other)
{
if (other == null || other.getClass() != this.getClass())
{
return false;
}
Permutation otherPermutation = (Permutation) other;
// List.equals should do the right thing here
return elements.equals(otherPermutation.elements);
}
(您还应该以与此对应的方式重写hashCode
。)
此外:
- 在最终类中定义相等是最简单的
- 由于您没有制作列表的防御性副本,因此在构建后调用方可能会对其进行变异;例如,如果将排列用作地图中的键,可能会导致问题
等于(对象)
。将编辑。关于您的建议,元素在我当前的情况下不能为空,但我同意您的意见,它应该检查它。我也会落实你的其他建议。谢谢你,乔恩!
Object o1 = p1;
@Override
public boolean equals(Object other)
{
if (other == null || other.getClass() != this.getClass())
{
return false;
}
Permutation otherPermutation = (Permutation) other;
// List.equals should do the right thing here
return elements.equals(otherPermutation.elements);
}