对集合的所有元素断言相同的条件

dav*_*ooh 3 java unit-testing assertj

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

assertThat(myObjectList).extracting(p -> p.getIntField()).isGreaterThan(0);
Run Code Online (Sandbox Code Playgroud)

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

cac*_*co3 7

选项 1

使用allMatch(Predicate)

assertThat(asList(0, 2, 3))
    .allMatch(i -> i > 0);
Run Code Online (Sandbox Code Playgroud)

选项 2(由Jens Schauder建议):

使用Consumer<E>基于断言allSatisfy

assertThat(asList(0, 1, 2, 3))
        .allSatisfy(i ->
                assertThat(i).isGreaterThan(0));
Run Code Online (Sandbox Code Playgroud)

第二个选项可能会产生更多信息性的失败消息。

在这种特殊情况下,该消息强调某些元素预计大于 0

java.lang.AssertionError: 
Expecting all elements of:
  <[0, 1, 2, 3]>
to satisfy given requirements, but these elements did not:

  <0> 
Expecting:
 <0>
to be greater than:
 <0> 
Run Code Online (Sandbox Code Playgroud)

  • 人们还可以使用“allSatisfy”,它允许编写包含断言的消费者。这是更多的代码,但也更灵活,并且可能会产生更好的失败消息。 (4认同)