Java JUnit:比较包含列表的两个bean,而不考虑列表顺序
我发现了很多关于比较列表对象的问题和答案,而不管它们的元素顺序如何,但我的问题更复杂:我有两个bean,其中包含一个列表。我想执行两个bean的assertEquals,而不管内部列表中元素的顺序如何。有什么简单的方法可以做到这一点吗?我想你可以找到答案。其想法是使用hamcrest断言Java JUnit:比较包含列表的两个bean,而不考虑列表顺序,java,list,junit,comparison,Java,List,Junit,Comparison,我发现了很多关于比较列表对象的问题和答案,而不管它们的元素顺序如何,但我的问题更复杂:我有两个bean,其中包含一个列表。我想执行两个bean的assertEquals,而不管内部列表中元素的顺序如何。有什么简单的方法可以做到这一点吗?我想你可以找到答案。其想法是使用hamcrest断言 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static or
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;
public class CompareListTest {
@Test
public void compareList() {
List<String> expected = Arrays.asList("String A", "String B");
List<String> actual = Arrays.asList("String B", "String A");
assertThat("List equality without order",
actual, containsInAnyOrder(expected.toArray()));
}
}
导入静态org.hamcrest.collection.isiterablecaininganyorder.containsInAnyOrder;
导入静态org.junit.Assert.assertThat;
公共类比较测试{
@试验
公共无效比较列表(){
预期列表=Arrays.asList(“字符串A”、“字符串B”);
List-actual=Arrays.asList(“字符串B”、“字符串A”);
断言(“列出无顺序的相等项”,
实际,包含任何订单(预期为.toArray());
}
}
我想你能找到答案。其想法是使用hamcrest断言
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;
public class CompareListTest {
@Test
public void compareList() {
List<String> expected = Arrays.asList("String A", "String B");
List<String> actual = Arrays.asList("String B", "String A");
assertThat("List equality without order",
actual, containsInAnyOrder(expected.toArray()));
}
}
导入静态org.hamcrest.collection.isiterablecaininganyorder.containsInAnyOrder;
导入静态org.junit.Assert.assertThat;
公共类比较测试{
@试验
公共无效比较列表(){
预期列表=Arrays.asList(“字符串A”、“字符串B”);
List-actual=Arrays.asList(“字符串B”、“字符串A”);
断言(“列出无顺序的相等项”,
实际,包含任何订单(预期为.toArray());
}
}
当您在幕后执行assertEquals(expectedObject,actualObject)时,junit实际上调用了object的equal方法。因此,我的建议是,如果您重写equal方法,那么您就可以实现您的期望
assertEqual背后的逻辑
String expectedString = String.valueOf(expected);
String actualString = String.valueOf(actual);
if (expectedString.equals(actualString)) {
return formatted + "expected: "
+ formatClassAndValue(expected, expectedString)
+ " but was: " + formatClassAndValue(actual, actualString);
} else {
return formatted + "expected:<" + expectedString + "> but was:<"
+ actualString + ">";
}
当您在幕后执行assertEquals(expectedObject,actualObject)时,junit实际上调用对象的equal方法。因此,我的建议是,如果您重写equal方法,那么您就可以实现您所期望的
assertEqual背后的逻辑
String expectedString = String.valueOf(expected);
String actualString = String.valueOf(actual);
if (expectedString.equals(actualString)) {
return formatted + "expected: "
+ formatClassAndValue(expected, expectedString)
+ " but was: " + formatClassAndValue(actual, actualString);
} else {
return formatted + "expected:<" + expectedString + "> but was:<"
+ actualString + ">";
}
不,我不想比较两个列表:我想比较两个同时包含列表和其他属性的bean。@Pino抱歉误解。如果您添加一些代码以更好地了解您的情况,那将非常好。不,我不想比较两个列表:我想比较两个同时包含列表和其他属性的bean。@Pino很抱歉误解。如果您添加一些代码以更好地了解您的情况,那将是非常棒的。是的,我知道。如果不改变equals()?任何“智能”库?@Pino你可以看看它有很多很酷的API方法用于此目的。是的,我知道。如果不改变equals()?任何“智能”库?@Pino你可以看看它有很多很酷的API方法。