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

问题描述 投票:0回答:1

我的自定义对象如下:

@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)]>

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

java testing junit assertj
1个回答
0
投票

如果您不希望或无法覆盖等于,那么可以尝试将usingRecursiveComparisonignoringAllOverriddenEquals结合使用(默认情况下,当被覆盖时,递归比较将使用等于),或更精细的替代方案ignoringOverriddenEqualsForTypes,[ C0]或ignoringOverriddenEqualsForFields

ignoringOverriddenEqualsForFieldsMatchingRegexes

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

有关详细信息,请参见isEqualTo

© www.soinside.com 2019 - 2024. All rights reserved.