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
。)

此外:

    要么考虑<代码>元素< /> >为null,要么在构造函数中验证它
  • 在最终类中定义相等是最简单的
  • 由于您没有制作列表的防御性副本,因此在构建后调用方可能会对其进行变异;例如,如果将排列用作地图中的键,可能会导致问题

对不起,我忘了在问题中添加它,但我有它。无论如何,我发布的结果都来自eclipse的表达式窗口,不只是一个guess@JuanGuerrero:否,您尚未重写
等于(对象)
。将编辑。关于您的建议,元素在我当前的情况下不能为空,但我同意您的意见,它应该检查它。我也会落实你的其他建议。谢谢你,乔恩!
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);
}