比较JUnit中用户定义对象的列表

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

我知道之前已经问过这个问题。但是,没有一个解决方案适合我。我有一个用户定义的类,它是3个类的组合。它看起来像这样:

Class compositeClass
{
UserDefinedClass1 useClass1;
UserDefinedClass2 useClass2;
UserDefinedClass3 useClass3;
}

我有一个测试方法,我需要比较这些复合类的列表。我尝试了Assert equals的几种变体,如:Hamcrest:

Assert.assertThat(mockCompositeList().getStandardLoadComposites(), 
                    equalTo(closeRequest.getStandardLoadComposites()));

Assert.assertArrayEquals(mockCompositeList().getStandardLoadComposites().toArray(), 
                closeRequest.getStandardLoadComposites().toArray());

两个实例都返回此AssertionError:

预计<StanardLoadComposite @ 6895a785>但<StandardLoadComposite @ 184f6be2>

它似乎是在比较参考而不是对象中的值。我是否必须覆盖equals运算符以使其比较用户定义对象的对象中的值?

junit junit4 hamcrest
2个回答
0
投票

考虑比较列表中的对象,而不是比较列表本身。我假设您创建了一个模拟列表,断言预期结果,对于实际结果(List),您要测试的方法将使用new创建新列表。无论如何,这个equals方法将比较三个对象的id,如果被覆盖则返回true。但是考虑覆盖你的equals和hash方法只是为了使你的断言正常工作。

两个列表不一定是同一个。但是你创建并传递给你的类的模拟对象在某些点之后不应该改变。如果这是你想要在测试中确定的,那么比较列表中的对象就可以了为了你。


0
投票

谢谢你的回复。我所做的是创建一个比较列表中的值的辅助方法。当类中只有3个值被设置时,要覆盖复合类的equals运算符将会有很多工作。因此,我比较了列表中每个对象的值,并根据比较返回true / false。然后在assert equals中使用该方法并比较boolean。

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