Java 如何比较JUnit5中包含另一个列表的列表?

Java 如何比较JUnit5中包含另一个列表的列表?,java,unit-testing,junit5,hamcrest,Java,Unit Testing,Junit5,Hamcrest,我有以下三个班: public class Foo { private Long fooId; private String fooName; private List<Bar> bars; } public class Bar { private Long barId; private String barName; private Foo foo; } public class FooBar { List<Foo> foo;

我有以下三个班:

public class Foo {
 private Long fooId;
 private String fooName;
 private List<Bar> bars;
}

public class Bar  {
    private Long barId;
    private String barName;
    private Foo foo;
}

public class FooBar {
    List<Foo> foo;
    List<Bar> bars;
}
公共类Foo{
私人长食物;
私有字符串名称;
私人酒吧名单;
}
公共类酒吧{
私人长巴里德;
私有字符串barName;
私人富福;
}
公共级FooBar{
罗列富;
列表栏;
}

FooBar
是我在回复中得到的。我对如何进行比较有点困惑,尤其是使用
hamcrest.Matchers.*
hasItem()
,还是有更好的方法。我们如何在Junit5中比较这一点?

首先,您的
Foo
Bar
应该有一些共同点,作为比较的基础,通过它们可以进行比较

如果他们没有任何共同点,我看不到任何方法来比较无与伦比的对象

只要您的
Foo
Bar
有共同之处,或者至少它们覆盖了
.equals()
,并实现了它们自己的功能,可以对这两种类型进行比较(可以相互比较这两种类型),您就可以使用:

assertIterableEquals(expected, actual); //from org.junit.jupiter.api.Assertions
此方法断言两个可数是否完全相等


请注意,如果预期值和实际值都为空,则认为它们相等。

只有当它们都为空时,
foo
才会等于
bar
。由于
foo
foo
的集合,
Bar
Bar
的集合,并且两者都扩展了
对象
,因此这些集合没有其他方法可以相等。如果唯一的目标是确定它们是否都是
null
@JeffScottBrown,那么就没有理由使用
assertetableequals
,你的意思是它们应该从某个公共超类型实现
.equals()
-不。我的意思是在这种情况下没有很好的理由使用
assertetableequals
。但是为什么呢?列表实现了集合,集合具有等于。“我不明白这为什么行不通。”杰夫斯科特布朗是乔治的原始例子: