You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:07:10