java 测试列表的内容,忽略某些字段

nkkqxpd9  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(141)

我有一个场景,我从一个方法调用中接收到一个列表,我想Assert这个列表包含正确的元素。一种方法是在每个元素中寻找一些细节,看看哪个预期的元素要与之比较--例如,一个名称。然而,这些元素也包含一个随机生成的UUID,我不关心是否要比较。
然后我想到一个测试工具可能会来拯救我。以下面这个简化的例子为例。
我有一个类狗:

public class Dog {
    private String name;
    private Integer age;
}

它们包含在一个列表中:

List<Dog> dogs = ... many dogs

现在我想测试一下这个列表是否包含了预期的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的两个对象。我如何比较两个列表中的所有dog?
附加问题:我如何在不知道顺序的情况下比较列表,或者我是否只需要Assert期望的狗包含在列表中。

xtfmy6hx

xtfmy6hx1#

给予使用元素比较器忽略字段AssertJ:

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);

编辑:可以使用新的递归比较API,它可以更好地控制要比较的内容:https://assertj.github.io/doc/#assertj-core-recursive-comparison-ignoring-fields

dm7nw8vv

dm7nw8vv2#

在我的例子中,我尝试比较不同类的列表。@Joel Costigliola暗示我使用usingElementComparatorIgnoringFields,所以我编写了以下代码:

List<ClassOne> input = new ArrayList<>();
input.add(...);
...
List<ClassTwo> result = new ArrayList<>();
...
assertThat(result).usingElementComparatorIgnoringFields("field1", "field2").isEqualTo(input);
uoifb46i

uoifb46i3#

上面提到的usingElementComparatorIgnoringFields方法现在已弃用。您应该使用usingRecursiveFieldByFieldElementComparatorIgnoringFields代替它。例如:

@Test
public void shouldCompareDogsWithoutAge() {
    final List<Dog> actual = List.of(new Dog("Azor", null), new Dog("Rex", null));
    assertThat(actual)
        .usingRecursiveFieldByFieldElementComparatorIgnoringFields("age")
        .containsExactlyInAnyOrder(new Dog("Azor", 12), new Dog("Rex", 9));
}

public class Dog {
    private String name;
    private Integer age;

    public Dog(final String name, final Integer age) {
        this.name = name;
        this.age = age;
    }
}

相关问题