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

能否自动为Java领域模型生成Truth.dev对应的Subject断言类?

Truth 自定义Subject自动生成方案

你需要的功能可以通过 Truth 官方提供的 AutoSubject 注解处理器实现,它的定位完全对标 AssertJ Generator,专门用来自动生成领域模型对应的 Truth 自定义Subject 样板代码,无需手动编写基础断言逻辑。

  • 引入AutoSubject依赖
    在项目中引入AutoSubject的注解和注解处理器依赖,以Maven为例:

    <dependency>
      <groupId>com.google.truth.extensions</groupId>
      <artifactId>truth-auto-extension-annotations</artifactId>
      <version>最新稳定版本</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.google.truth.extensions</groupId>
      <artifactId>truth-auto-extension-processor</artifactId>
      <version>最新稳定版本</version>
      <scope>provided</scope>
    </dependency>
    

    Gradle项目可以将处理器配置到annotationProcessor路径下。

  • 给领域类添加生成注解
    给需要生成自定义Subject的领域类添加@GenerateSubject注解即可:

    import com.google.common.truth.extension.AutoSubject.GenerateSubject;
    
    @GenerateSubject
    @lombok.Value
    public class Car {
        String name;
        Make make;
        int colourId;
    
        public enum Make {PLASTIC, METAL}
    }
    
  • 编译生成断言代码
    执行项目编译后,工具会自动生成对应CarSubject类和配套的静态assertThat入口方法,你需求中提到的所有调用方式都原生支持:

    • 等值断言:assertThat(car).hasMakeEqualTo(Car.Make.PLASTIC)
    • 基础类型嵌套断言:assertThat(car).hasColourId().isAtLeast(5)
    • 字符串属性原生Truth能力支持:assertThat(car).hasName().ignoringTrailingWhiteSpace().isEqualTo("sally")
    • 嵌套对象链式断言:如果Person类包含Address类型属性,生成的hasAddress()方法会返回自动生成的AddressSubject实例,直接支持后续hasStreet().ignoringCase().endsWith("Rd")这类链式调用。

如果需要添加自定义的复杂断言逻辑,直接继承自动生成的Subject类扩展即可,自动生成的代码不会覆盖你的自定义逻辑。

内容的提问来源于stack exchange,提问作者Antony Stubbs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:03