在对象列表上调用提取后,如何检查没有值为空?

gph*_*gph 4 java assertj

在单元测试中使用 AssertJ,我想从此类对象的列表中提取自定义对象的多个属性,extracting并检查它们是否全部非空。

例如,假设我想提取fieldA和:fieldBMyObject

import static from org.assertj.core.api.Assertions.assertThat;

List<MyObject> theList = ...; 
assertThat(theList).extracting("fieldA", "fieldB")).isNotNull();
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚正在检查的内容。

正在isNotNull检查:

  1. 返回的iterableextracting不为空?
  2. 列表中没有元组为空?
  3. 每个元组中的每个值都不为空?

Ste*_*dio 5

按照你的例子:

assertThat(theList).extracting("fieldA", "fieldB").isNotNull();
Run Code Online (Sandbox Code Playgroud)

isNotNull只检查Iterable返回的元组extracting不为空。

flatExtracting+doesNotContainNull

要检查提取的值是否都不为空,您可以使用flatExtractingand doesNotContainNull

assertThat(theList).flatExtracting("fieldA", "fieldB").doesNotContainNull();
Run Code Online (Sandbox Code Playgroud)

如果发生故障,会产生如下消息:

java.lang.AssertionError: 
Expecting actual:
  ["value1", "value2", null, "value4"]
not to contain null elements
Run Code Online (Sandbox Code Playgroud)

由于解决方案的扁平化性质,没有指示哪个对象导致了故障,但可以通过计算显示的对来识别actual

extracting+noneMatch

可以增加复杂性以获得更清晰的错误消息:

assertThat(theList).extracting("fieldA", "fieldB").noneMatch(tuple -> tuple.toList().contains(null));
Run Code Online (Sandbox Code Playgroud)

失败时会产生:

java.lang.AssertionError: [Extracted: fieldA, fieldB] 
Expecting no elements of:
  [("value1", "value2"), (null, "value4")]
to match given predicate but this element did:
  (null, "value4")
Run Code Online (Sandbox Code Playgroud)

extracting+ allSatisfy+doesNotContainNull

更清晰的错误消息的另一种选择:

assertThat(theList).extracting("fieldA", "fieldB").allSatisfy(tuple -> assertThat(tuple.toList()).doesNotContainNull());
Run Code Online (Sandbox Code Playgroud)

失败时会产生:

java.lang.AssertionError: [Extracted: fieldA, fieldB] 
Expecting all elements of:
  [("value1", "value2"), (null, "value4")]
to satisfy given requirements, but these elements did not:

(null, "value4")
error: 
Expecting actual:
  [null, "value4"]
not to contain null elements
Run Code Online (Sandbox Code Playgroud)