java - 使用 AssertJ 进行测试时从实际对象和预期对象中提取字段

标签 java testing assertj

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

@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;
    }
}

是否有可能以更紧凑的方式实现相同的结果,而无需覆盖 User 类的 equals 方法?我正在寻找类似以下内容的内容:

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

或者,更好的是:

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

最佳答案

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

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

无法更改 User(因此无法覆盖 hashcode()equals(),或添加 getter),您将需要从两个集合中提取 id 并比较它们。这对我有用,但我承认它有点难看。

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

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

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

关于java - 使用 AssertJ 进行测试时从实际对象和预期对象中提取字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44366684/

相关文章:

Java - 如何制作 Mac 弹出窗口?

java - 尝试从 Firebase 检索数据但获取 null

java - Android 中可打包数组类的问题

datetime - 在不更改 Windows 系统时钟的情况下伪造时间

java - 如何指定没有输入的测试用例

java - 调用包含 "#"的号码

javascript - 有没有更好的方法来使用reduce测试n个函数? [JS]

java - Assertj 3.16.1 中是否弃用了方法 "hasOnlyElementsOfType"

java - 在 AssertJ 中比较之前对数组进行排序

java - assertJ findFrame() 失败并出现 NoClassDefFoundError