Set.equals不起作用:只检查第一个hashSet

时间:2016-09-19 08:58:57

标签: java maven junit

我在运行Maven测试时遇到了一些问题,我的assertEquals(Set1,Set2)不起作用:因为一个不明原因,即使Set1等于Set2,它也会自动返回一个断言失败。

我已经调查了一下,通常assertEquals(Set1,Set2)应该调用Set1.equals(Set2),然后Set1.equals(Set2)将比较它们之间的两个元素的元素调用两个方法.hashCode( )和.equals()。所以我放了一些System.out.println来检查一切是否正常。但函数.hashCode只被调用一次,我不知道为什么。

这里有一些代码:

System.out.println("assertProblem");
assertEquals(Set1, Set2);

if(Set1.equals(Set2))
    System.out.println("equals");
else
    System.out.println("not equals");

可以包含我的Set的两种实体:

@Override
public int hashCode() {
    System.out.println("hashCode");
    int hash = 1;

    hash *= id;
    if(derogation != null)
        hash *= derogation.getId();
    if(description != null)
        hash *= description.hashCode();

    return hash;
}

@Override
public boolean equals(Object object) {
    System.out.println("equals");
    [...]
}
-----------------------------------------------
@Override
public int hashCode() {
    System.out.println("hashCode2");
    int hash = 1;

    hash *= id;
    if(derogation != null)
        hash *= derogation.getId();
    if(chemin != null)
        hash *= chemin.hashCode();
    if(userFam != null)
        hash *= userFam.hashCode();
    if(serveur != null)
        hash *= serveur.hashCode();
    if(type != null)
        hash *= type.hashCode();

    return hash;
}

@Override
public boolean equals(Object object){
    System.out.println("equals2");
    [...]
}

my 2 Sets的值:

[{id:3658, derogationId:657, description:description ! 0}, {id:3659, derogationId:657,chemin: chemin0, userFam:User/Family0, serveur:serveur010, type:ecriture}, {id:3660, derogationId:657, description:description ! 1}, {id:3661, derogationId:657,chemin: chemin1, userFam:User/Family1, serveur:serveur011, type:ecriture}, {id:3662, derogationId:657, description:description ! 2}, {id:3663, derogationId:657,chemin: chemin2, userFam:User/Family2, serveur:serveur012, type:ecriture}]
[{id:3658, derogationId:657, description:description ! 0}, {id:3659, derogationId:657,chemin: chemin0, userFam:User/Family0, serveur:serveur010, type:ecriture}, {id:3660, derogationId:657, description:description ! 1}, {id:3661, derogationId:657,chemin: chemin1, userFam:User/Family1, serveur:serveur011, type:ecriture}, {id:3662, derogationId:657, description:description ! 2}, {id:3663, derogationId:657,chemin: chemin2, userFam:User/Family2, serveur:serveur012, type:ecriture}]

结果:

assertProblem
hashCode
not equals

有人可以在这里给我一些帮助吗?

THX

1 个答案:

答案 0 :(得分:1)

致Ole V.V.和大卫华莱士评论说我发现了什么问题。

伊兰:

  

只调用一次hashCode这一事实意味着在Set1中找不到测试的Set2的第一个元素。要在HashSet中查找元素,首先使用hashCode来定位bin,然后使用equals来测试bin中的所有元素。如果bin为空,则不会调用equals。如果比较的元素是不同的类型(你说你的集合包含两种类型的元素,每种类型都有不同的hashCode实现),这就解释了行为。

Ole V.V。

  

根据Hibernate documentation,PersistentSet会覆盖equals(Object)。

所以我在HashSet中转换我的PersistentSet以使其工作,那些人:

assertEquals(new HashSet(Set1), new HashSet(Set2));

大家好。