在集合的所有元素上声明相同条件

时间:2018-11-28 18:48:30

标签: java unit-testing assertj

我正在使用AssertJ,需要检查列表中的所有对象是否具有intField > 0。像这样:

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

实现此目标的正确方法是什么?我应该使用其他图书馆吗?

1 个答案:

答案 0 :(得分:2)

似乎图书馆没有提供断言您描述的方式的选项(即使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>