0

我想检查一个列表是否包含另一个列表的子列表。这是我目前如何做的一个虚拟示例:

@Test
public void testExtracting() throws Exception {
    final List<User> users = new ArrayList<>();
    users.add(new User(5234, "Adam"));
    users.add(new User(4635, "David"));

    final List<User> newUsers = new ArrayList<>();
    newUsers.add(new User(6143, "Bob"));
    newUsers.add(new User(3465, "Cindy"));

    users.addAll(newUsers);

    assertThat(users).extracting("id").contains(newUsers.get(0).id, newUsers.get(1).id);
}

public static class User {
    public long id;
    public String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

equals是否可以在不覆盖类方法的情况下以更紧凑的方式实现相同的结果User?我正在寻找类似的东西:

assertThat(users).contains(newUsers.get(0), newUsers.get(1)).extracting("id");

或者,更好的是:

assertThat(users).contains(newUsers.subList(0, 2)).extracting("id");
4

2 回答 2

2

如果您能够向 中添加getId()方法User,则可以使用提取器解决此问题:

assertThat(users)
    .extracting("id")
    .containsAll(extractProperty("id").from(newUsers));

如果无法更改User(因此没有覆盖hashcode()orequals()或添加吸气剂),您将需要id从两组中提取并比较它们。这对我有用,但我承认它有点难看。

assertThat(users)
    .extracting("id")
    .containsAll(newUsers.stream().map(it -> it.id).collect(Collectors.toSet()));

我正在做的是使用 assertJ 从用户集和 Java 8 流/映射中提取 id 以在一个集合中获取所有 newUser id。这样,您的newUsers集合可以任意大,您不必自己对映射进行硬编码。

请注意,第二个示例中的流/映射工作与第一个示例中的工作相同extractProperty,我们只是手动完成。

于 2017-06-05T14:44:22.123 回答
0

您可以为该id属性创建一个 getter 方法并执行以下操作:

assertThat(users).usingElementComparator(Comparator.comparing(User::getId)).containsAll(newUsers);
于 2021-10-15T08:05:25.220 回答