Java 使用assertJ方法containsOnly()比较自定义对象的数组

Java 使用assertJ方法containsOnly()比较自定义对象的数组,java,testing,junit,assertj,Java,Testing,Junit,Assertj,我的自定义对象如下所示: @Accessors(chain = true) @Getter @Setter @AllArgsConstructor @ToString public class SocialLink { private String platform; private String link; } 我的测试代码如下所示: SocialLink[] arr1 = new SocialLink[] { new SocialLink("Facebo

我的自定义对象如下所示:

@Accessors(chain = true)
@Getter
@Setter
@AllArgsConstructor
@ToString
public class SocialLink {

    private String platform;

    private String link;
}
我的测试代码如下所示:

SocialLink[] arr1 = new SocialLink[] {
        new SocialLink("Facebook", "Facebook Link"),
        new SocialLink("Google", "Google Link")
};
SocialLink[] arr2 = new SocialLink[] {
        new SocialLink("Google", "Google Link"),
        new SocialLink("Facebook", "Facebook Link")
};
assertThat(arr1).containsOnly(arr2);
故障日志:

java.lang.AssertionError: 
Expecting:
  <[SocialLink(platform=Facebook, link=Facebook Link),
    SocialLink(platform=Google, link=Google Link)]>
to contain only:
  <[SocialLink(platform=Google, link=Google Link),
    SocialLink(platform=Facebook, link=Facebook Link)]>
elements not found:
  <[SocialLink(platform=Google, link=Google Link),
    SocialLink(platform=Facebook, link=Facebook Link)]>
and elements not expected:
  <[SocialLink(platform=Facebook, link=Facebook Link),
    SocialLink(platform=Google, link=Google Link)]>
java.lang.AssertionError:
期望:
仅包含:
未找到元素:
以及不预期的因素:

containsOnly()方法可以很好地处理字符串数组,但为什么它不能用于自定义对象数组呢?

如果您不想或不能覆盖等于,那么尝试的一个选项是使用递归比较调用
,或者使用更细粒度的替代方法
忽略overridenequalsfortypes
ignoringoverridenequalsforfields
ignoringoverridenequalsforfieldsmatchingexes

 assertThat(links1).usingRecursiveComparison()
                   .ignoringCollectionOrder() 
                   .isEqualTo(expectedLinks);
请注意,递归比较目前仅提供
isEqualTo
断言


有关详细信息,请参阅。

是否覆盖了
SocialLink
equal()
hashCode()
方法?也许你需要
containsInAnyOrder
@MincongHuang No.
SocialLink
类看起来正是我在这里给出的。我希望assertJ会像我们使用
isEqualToComparingFieldByField()时那样自动匹配字段method@MincongHuang是的,重写equal()和hashCode()成功了。我通常不想覆盖模型类中的那些,因为它有优点和缺点。谢谢。如果不想覆盖equals,可以使用
usingElementComparator
为元素指定一个比较器。