Утверждать одно и то же условие для всех элементов коллекции - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю с AssertJ, и мне нужно проверить, что все объекты в списке имеют intField > 0.Примерно так:

assertThat(myObjectList).extracting(p -> p.getIntField()).isGreaterThan(0);

Как правильно этого добиться?Должен ли я использовать какую-то другую библиотеку?

1 Ответ

0 голосов
/ 28 ноября 2018

Кажется, что библиотека не предоставляет опцию для утверждения описанного вами способа (даже AbstractIntArrayAssert не позволяет это сделать), но вы можете:

1) использовать AbstractIterableAssert#allMatch(Predicate)

assertThat(asList(0, 2, 3))
  .allMatch(i -> i > 0);

2) Если вы действительно хотите использовать что-то вроде isGreaterThan на ListAssert, вы можете создать пользовательский ListAssert:

public class CustomListAssert<E> extends ListAssert<E> {
  public static <E> CustomListAssert<E> assertThat(List<E> list) {
    return new CustomListAssert<>(list);
  }

  public CustomListAssert(List<? extends E> actual) {
    super(actual);
  }

  public IntListAssert extractingInt(ToIntFunction<E> mapper) {
    return new IntListAssert(actual.stream()
      .mapToInt(mapper).boxed().collect(toList()));
  }    
}

public class IntListAssert extends ListAssert<Integer> {
  public IntListAssert(List<Integer> actual) {
    super(actual);
  }

  public IntListAssert allGreaterThan(int i) {
    allMatch(n -> n > i);
    return this;
  }
}

И используйте это так:

@Test
public void test() {
  CustomListAssert.assertThat(asList(0, 2, 3))
      .extractingInt(i -> i * 2)
      .allGreaterThan(0);
}

Что в моем случае дает:

java.lang.AssertionError: 
Expecting all elements of:
  <[0, 4, 6]>
to match given predicate but this element did not:
  <0>
...