使用 AssertJ,如何对列表的内容执行复杂的断言?
Using AssertJ, how do I perform complex assertions on the contents of a list?
在 AssertJ 中,您可以执行以下操作来断言列表的内容:
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
我经常发现自己想对元素本身做更复杂的断言,例如,断言爱丽丝是个高个子黑发女郎,而鲍勃又瘦又秃。
使用 AssertJ 执行此操作的最佳方法是什么?
我自己的解决办法是:
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
list.stream()
.filter(person -> "Alice".equals(person.getName()))
.forEach(alice -> {
assertThat(alice).extracting("size").isEqualTo("tall")
assertThat(alice).extracting("hair").isEqualTo("brunette")
});
list.stream()
.filter(person -> "Bob".equals(person.getName()))
.forEach(bob -> {
assertThat(bob).extracting("size").isEqualTo("tiny")
assertThat(bob).extracting("hair").isNull()
});
或等同于 (java 7) :
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
for(Person person : list){
switch (testCase.getName()){
case "Alice":
assertThat(person).extracting("size").isEqualTo("tall")
assertThat(person).extracting("hair").isEqualTo("brunette")
break;
case "Bob":
assertThat(person).extracting("size").isEqualTo("tiny")
assertThat(person).extracting("hair").isNull()
break;
}
}
但我想知道是否有更好的解决方案
我喜欢这个解决方案区分列表中的预期元素和元素本身正确的事实。
我经常发现只表达整个预期集合更容易:
assertThat(list).containsOnlyElementsOf(Arrays.asList(
new Person("Alice", "tall", "brunette"),
new Person("Bob", "tiny", null)
)
对于过滤,您可以直接使用 filteredOn, then either allMatch or allSatisfy 的任何风格(当我说直接时,我的意思是不需要流式传输您的集合来过滤它)。
我建议探索 AssertJ API,您还有其他断言,例如 anySatisfy or using conditions 以及 are
、areAtLeast
等方法,...绝大多数 API 有带有示例的 javadoc 来展示如何使用它。
另外可以看看 assertj-examples 项目中的 examples。
希望对您有所帮助
@Test
public void test(){
assertThat(list).filteredOn(person -> person.getName().equals("Alice")).extracting("size").first().isEqualTo("tall");
assertThat(list).filteredOn(person -> person.getName().equals("Alice")).extracting("hair").first().isEqualTo("brunette");
assertThat(list).filteredOn(person -> person.getName().equals("Bob")).extracting("size").first().isEqualTo("tiny");
assertThat(list).filteredOn(person -> person.getName().equals("Bob")).extracting("hair").first().isNull();
}
在 AssertJ 中,您可以执行以下操作来断言列表的内容:
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
我经常发现自己想对元素本身做更复杂的断言,例如,断言爱丽丝是个高个子黑发女郎,而鲍勃又瘦又秃。 使用 AssertJ 执行此操作的最佳方法是什么?
我自己的解决办法是:
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
list.stream()
.filter(person -> "Alice".equals(person.getName()))
.forEach(alice -> {
assertThat(alice).extracting("size").isEqualTo("tall")
assertThat(alice).extracting("hair").isEqualTo("brunette")
});
list.stream()
.filter(person -> "Bob".equals(person.getName()))
.forEach(bob -> {
assertThat(bob).extracting("size").isEqualTo("tiny")
assertThat(bob).extracting("hair").isNull()
});
或等同于 (java 7) :
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
for(Person person : list){
switch (testCase.getName()){
case "Alice":
assertThat(person).extracting("size").isEqualTo("tall")
assertThat(person).extracting("hair").isEqualTo("brunette")
break;
case "Bob":
assertThat(person).extracting("size").isEqualTo("tiny")
assertThat(person).extracting("hair").isNull()
break;
}
}
但我想知道是否有更好的解决方案
我喜欢这个解决方案区分列表中的预期元素和元素本身正确的事实。
我经常发现只表达整个预期集合更容易:
assertThat(list).containsOnlyElementsOf(Arrays.asList(
new Person("Alice", "tall", "brunette"),
new Person("Bob", "tiny", null)
)
对于过滤,您可以直接使用 filteredOn, then either allMatch or allSatisfy 的任何风格(当我说直接时,我的意思是不需要流式传输您的集合来过滤它)。
我建议探索 AssertJ API,您还有其他断言,例如 anySatisfy or using conditions 以及 are
、areAtLeast
等方法,...绝大多数 API 有带有示例的 javadoc 来展示如何使用它。
另外可以看看 assertj-examples 项目中的 examples。
希望对您有所帮助
@Test
public void test(){
assertThat(list).filteredOn(person -> person.getName().equals("Alice")).extracting("size").first().isEqualTo("tall");
assertThat(list).filteredOn(person -> person.getName().equals("Alice")).extracting("hair").first().isEqualTo("brunette");
assertThat(list).filteredOn(person -> person.getName().equals("Bob")).extracting("size").first().isEqualTo("tiny");
assertThat(list).filteredOn(person -> person.getName().equals("Bob")).extracting("hair").first().isNull();
}