代码之家  ›  专栏  ›  技术社区  ›  homaxto

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

  •  20
  • homaxto  · 技术社区  · 8 年前

    我有一个场景,在这个场景中,我从一个方法调用中收到一个列表,并且我想断言该列表包含正确的元素。一种方法是在每个元素中查找一些细节,以查看要与哪个预期元素进行比较,例如名称。然而,这些元素还包含随机生成的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")
    ))
    


    额外的问题:如果我不知道列表的顺序,或者如果我只需要断言预期的狗包含在列表中,我如何比较列表。

    2 回复  |  直到 8 年前
        1
  •  37
  •   Joel Costigliola    6 年前

    试试AssertJ的 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);
    

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

        2
  •  5
  •   CoolMind    8 年前

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

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