能否自动为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
相关产品推荐
相关产品推荐

