在单元测试中使用AssertJ,我想通过extracting从这样的对象列表中提取定制对象的几个属性,并判断它们是否都是非空的.

例如,假设我想从MyObject中提取fieldAfieldB:

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

List<MyObject> theList = ...; 
assertThat(theList).extracting("fieldA", "fieldB")).isNotNull();

我搞不清楚正在判断的是什么.

是不是isNotNull正在判断:

  1. extracting返回的迭代数不为空?
  2. 列表中没有元组为空吗?
  3. 每个元组中的每个值都不是空的吗?

推荐答案

按照您的示例进行操作:

assertThat(theList).extracting("fieldA", "fieldB").isNotNull();

isNotNull只判断extracting返回的Iterable个元组是否不为空.

flatExtracting + doesNotContainNull

要判断提取的值是否都不为空,可以使用flatExtractingdoesNotContainNull:

assertThat(theList).flatExtracting("fieldA", "fieldB").doesNotContainNull();

在出现故障的情况下,它会生成如下消息:

java.lang.AssertionError: 
Expecting actual:
  ["value1", "value2", null, "value4"]
not to contain null elements

由于解决方案的扁平化性质,没有哪个对象导致故障的指示,但是可以通过对所显示的actual中的配对进行计数来识别.

extracting + noneMatch

为了使错误消息更清晰,可能会增加复杂性:

assertThat(theList).extracting("fieldA", "fieldB").noneMatch(tuple -> tuple.toList().contains(null));

在失败的情况下产生的yield :

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

extracting + allSatisfy + doesNotContainNull

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

assertThat(theList).extracting("fieldA", "fieldB").allSatisfy(tuple -> assertThat(tuple.toList()).doesNotContainNull());

在失败的情况下产生的yield :

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

Java相关问答推荐

查找最大子数组的和

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

ittext pdf延迟签名,签名无效

弹簧靴和龙目岛

Java .类参数不通过构造函数传递

是否在允许数组元素为空时阻止 idea 为空性警告?

Mapstruct不能正确/完全映射属性

通过Spring Security公开Spring Boot执行器端点

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

将PNG转换为位图自定义十六进制字符串

如何在JUNIT测试中覆盖ExecutorService?

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

从泛型枚举创建EnumMap

持续时间--为什么在秒为负数的情况下还要做额外的工作?

在Java Spring JPA中插入包含对其他实体的引用的列

ReturnedRect在升级后反转

为什么我得到默认方法的值而不是被覆盖的方法的值?

从 Java 17 切换回 Java 8 后出现的问题