1

在 AssertJ 中,您可以执行以下操作来断言列表的内容:

assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");

我经常发现自己想要对元素本身做更复杂的断言,例如,断言 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;
    }
}

但我想知道是否有更好的解决方案。

我喜欢这个解决方案区分列表中的预期元素和元素本身正确的事实。

4

3 回答 3

5

对于过滤,您可以直接使用任何类型的filteredOn,然后使用allMatchallSatisfy(当我直接说时,我的意思是无需流式传输您的集合来过滤它)。

我建议探索 AssertJ API,您还有其他断言,例如anySatisfy或使用带有, , ... 等方法的条件,绝大多数 API 都有 javadoc 和示例来展示如何使用它。areareAtLeast

此外,可以查看assertj-examples 项目中的示例

希望能帮助到你

于 2017-10-18T00:17:37.323 回答
2
 @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();
}
于 2018-02-15T16:06:44.233 回答
0

通常我发现只表达整个预期的集合更容易:

assertThat(list).containsOnlyElementsOf(Arrays.asList(
    new Person("Alice", "tall", "brunette"),
    new Person("Bob", "tiny", null)
)
于 2017-10-17T14:05:59.840 回答