我有一个场景,我从方法调用中收到一个列表,我想声明该列表包含正确的元素。一种方法是在每个元素中查找一些细节,以查看要与哪个预期元素进行比较 - 例如。一个名字。但是元素还包含一个随机生成的UUID,我不在乎比较 然后我想一个测试工具可能会来救我。采用以下简化示例。
我有一个班级狗:
public class Dog {
private String name;
private Integer age;
}
它们包含在列表中:
List<Dog> dogs = ... many dogs
现在我想测试列表中是否包含预期的狗,但由于某些原因我不知道某些字段 - 让我们说age
。
我已经尝试过使用assertj和hamcrest,但我找不到正确的解决方案,它们都比较了两个列表,同时也忽略了一些字段。
到目前为止,这就是我所拥有的(使用hamcrest):
List<Dog> actualDogs = codeUndertest.findDogs(new Owner("Basti"));
List<Dog> expectedDogs = createExpectedListOfDogsWithoutTheAge();
Matcher.assertThat(actualDogs.get(0), Matcher.is(com.shazam.shazamcrest.matcher.Matchers
.sameBeanAs(expectedDogs.(0))
.ignoring("age")
))
这有效,但它只比较了Dog类的两个对象。如何比较两个列表中的所有狗? 奖金问题:如何在不知道订单的情况下比较列表,或者我是否只需断言预期的狗包含在列表中。
答案 0 :(得分:4)
试试AssertJ&#39; usingElementComparatorIgnoringFields:
Employee bill = new Employee("Bill", 60, "Micro$oft");
Employee appleBill = new Employee("Billie", 60, "Apple");
List<Employee> employees = newArrayList(bill, appleBill);
Employees[] expectedEmployees = { new Employee("Bill", 60, "Google"),
new Employee("Billie", 60, "Facebook") };
// this assertion succeeds as we don't compare the company field.
assertThat(employees).usingElementComparatorIgnoringFields("company")
.contains(expectedEmployees);
答案 1 :(得分:2)
在我的情况下,我试图比较不同类的列表。 @Joel Costigliola暗示我使用usingElementComparatorIgnoringFields
,所以我写了这段代码:
List<ClassOne> input = new ArrayList<>();
input.add(...);
...
List<ClassTwo> result = new ArrayList<>();
...
assertThat(result).usingElementComparatorIgnoringFields("field1", "field2").isEqualTo(input);