如何使用AssertJ检查某些List是否仅包含一个特定元素或为空

THM*_*THM 1 java testing assertj

我有:

@Test
public void testSomethingInFooFunction() {
    //given
    Something parameter = new Something();
    //when
    List<Object> result = foo(parameter);
    //then

    // not working
    assertThat(result).isEmpty().or().containsOnly(something());
    assertThat(result).is(v -> v.isEmpty() || v.containsOnly(something());

    //is working
    assertThat(result.isEmpty() || (
        result.contains(something())
        && result.size() == 1)
    ).isTrue();

}
Run Code Online (Sandbox Code Playgroud)

还有其他测试条件的方法,例如:

result.isEmpty()|| (result.contains(something())&& result.size()== 1)

问:如何使用AssertJ 3.11.1简化它?

Ond*_* K. 6

该测试应满足您的需求:

@Test
public void test() {
    List<Integer> integers = Collections.singletonList(1);
    assertThat(integers)
            .has(Assertions.anyOf(
                    new Condition<>(List::isEmpty, "List is empty"),
                    new Condition<>(list -> list.size() == 1 && list.contains(1), "List contains only number 1")
            ));
}
Run Code Online (Sandbox Code Playgroud)

编辑:您也可以allOf代替第二个条件:

AllOf.allOf(
      new Condition<>(list -> list.size() == 1, "List has size 1"),
      new Condition<>(list -> list.contains(1), "List contains number 1")
)
Run Code Online (Sandbox Code Playgroud)

编辑2:或将其与所需的列表进行比较:

new Condition<>(list -> Collections.singletonList(1).equals(list), "the list is equal to a list of the number 1")
Run Code Online (Sandbox Code Playgroud)