Как проверить, содержит ли какой-либо список только один конкретный элемент ИЛИ пуст, используя AssertJ - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть:

@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();

}

Есть ли другой способ проверки условия, например:

result.isEmpty () ||(result.contains (что-то ()) && result.size () == 1)

Q: Как упростить это с помощью AssertJ 3.11.1?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

То, что вы ищете, появится в следующем выпуске: https://github.com/joel-costigliola/assertj-core/issues/1304.

assertThat("foo").satisfiesAnyOf(actual -> assertThat(actual).contains("foo"),
                                 actual -> assertThat(actual).isEmpty());

Тем временем, лучший вариант - использовать anyOf, как предложено Ondra K или ваш.

0 голосов
/ 04 декабря 2018

Этот тест должен соответствовать вашим потребностям:

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

РЕДАКТИРОВАТЬ: Вы также можете allOf вместо второго условия:

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

РЕДАКТИРОВАТЬ 2: Или сравнить егос нужным списком:

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