使用 AssertJ 进行测试时从实际对象和预期对象中提取字段
Extracting field from both actual and expected objects when testing with 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
class 的 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()
,或添加吸气剂),您需要从两个集合中提取 id
并比较它们。这对我有用,但我承认它有点难看。
assertThat(users)
.extracting("id")
.containsAll(newUsers.stream().map(it -> it.id).collect(Collectors.toSet()));
我正在做的是使用 assertJ 从用户集中提取 ID,并使用 Java 8 streams/map 获取一个集合中的所有新用户 ID。这样,您的 newUsers
集合可以任意大,您不必自己对映射进行硬编码。
请注意,第二个示例中的 stream/map 工作与 extractProperty
在第一个示例中完成的工作相同,我们只是手动完成。
您可以为 id
属性 创建一个 getter 方法并执行此操作:
assertThat(users).usingElementComparator(Comparator.comparing(User::getId)).containsAll(newUsers);
我想检查一个列表是否包含另一个列表的子列表。这是我目前如何做的虚拟示例:
@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
class 的 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()
,或添加吸气剂),您需要从两个集合中提取 id
并比较它们。这对我有用,但我承认它有点难看。
assertThat(users)
.extracting("id")
.containsAll(newUsers.stream().map(it -> it.id).collect(Collectors.toSet()));
我正在做的是使用 assertJ 从用户集中提取 ID,并使用 Java 8 streams/map 获取一个集合中的所有新用户 ID。这样,您的 newUsers
集合可以任意大,您不必自己对映射进行硬编码。
请注意,第二个示例中的 stream/map 工作与 extractProperty
在第一个示例中完成的工作相同,我们只是手动完成。
您可以为 id
属性 创建一个 getter 方法并执行此操作:
assertThat(users).usingElementComparator(Comparator.comparing(User::getId)).containsAll(newUsers);