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
为元素指定一个比较器。