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

AssertJ如何比较父对象与强转为父类实例的子类对象

解决AssertJ对比父类引用子类对象时只校验父类属性的问题

问题根源在于AssertJ递归比较默认会依据对象的运行时类型(此处实际是Puddle)扫描所有字段,而你的预期对象是Dog类型,两者字段不匹配导致报错。

最优解决方案

使用AssertJ提供的ignoringFieldsNotDeclaredIn()方法,指定仅对比父类Dog中声明的字段,自动忽略子类的额外属性,无需手动维护子类字段列表:

@Test
void testExpectedDogName() {
  Dog actual = constructParentOfChildObject();
  Dog expectedResult = new Dog("test");
  
  assertThat(actual)
    .usingRecursiveComparison()
    .ignoringFieldsNotDeclaredIn(Dog.class)
    .isEqualTo(expectedResult);
}

为什么这个方案更好

  • 扩展性强:后续子类新增字段时,无需修改测试代码,方法会自动忽略所有非父类声明的字段
  • 代码简洁:不用手动编写ignoringFields()罗列所有子类字段,也无需额外编写克隆父类对象的工具方法

备选方案(针对特定字段校验)

如果只需要校验父类的部分字段,也可以用comparingOnlyFields()指定具体字段名:

assertThat(actual)
  .usingRecursiveComparison()
  .comparingOnlyFields("name")
  .isEqualTo(expectedResult);

内容的提问来源于stack exchange,提问作者Fran Na Jaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:23:16