如何对Scylla中含Optional属性的实体做内容匹配断言?
含Optional属性的实体对象断言问题
实体类定义
public class Object { @Nullable byte[] prop1; byte[] prop2; public Optional<byte[]> getProp1(){ return Optional.ofNullable(prop1); } }
测试场景与问题
在Scylla集成测试中,生成实体fixture存入数据库后,通过仓库方法取回数据并断言:
assertThat(result).isPresent(); assertThat(result).contains(expectedObject);
当实体没有Optional属性时,contains断言可正常工作;但存在Optional属性时,由于默认equals()仅比较对象引用(存储和取回的是不同对象实例,哈希值分别为Object@5dtsad和Object@53kjlas),导致断言失败。
解决方案
1. 重写实体类的equals()和hashCode()
默认equals方法仅比较对象引用,重写时需覆盖所有属性的内容比较:
- 对于
prop2这类byte数组,要用Arrays.equals()比较实际内容,不能直接用引用比较 - 对于
getProp1()返回的Optional,要比较其内部包裹的值(存在时同样用Arrays.equals()校验byte数组)
可以通过IDE自动生成该方法,或借助Lombok的@EqualsAndHashCode注解(需配置让它正确处理Optional和byte数组)。
2. 使用AssertJ递归比较断言(推荐)
AssertJ提供usingRecursiveComparison()方法,无需依赖实体类的equals实现,会递归检查对象的所有属性内容,包括Optional包裹的值和byte数组的实际内容:
assertThat(result).isPresent(); assertThat(result.get()).usingRecursiveComparison().isEqualTo(expectedObject);
这种方式不用逐个显式断言每个属性,用法简洁且能覆盖所有属性的内容校验。
3. Hamcrest属性匹配器(备选)
如果使用Hamcrest断言,可以用samePropertyValuesAs匹配器,部分场景可能需要自定义匹配器辅助处理Optional和数组类型:
assertThat(result.get(), samePropertyValuesAs(expectedObject));
内容的提问来源于stack exchange,提问作者Wallace Soares
相关产品推荐
相关产品推荐

