如何mock标注@ConstructorBinding的配置属性类并解决final类报错
错误原因
@lombok.Value 注解默认会给标注的类添加 final 修饰符,而Mockito默认不支持mock final类,因此抛出上述错误。
修复方案
你可以根据实际场景选择以下任意一种方案:
方案1:开启Mockito对final类的mock支持(无侵入业务代码)
该方案不需要修改生产侧的代码,仅调整测试侧配置即可:
- 在测试资源目录(一般为
src/test/resources)下新建mockito-extensions文件夹 - 在该文件夹下新建名为
org.mockito.plugins.MockMaker的文件 - 向文件中写入一行内容:
mock-maker-inline
配置完成后重启测试即可支持final类的mock,不会影响原有配置类的不可变特性与配置绑定功能。
方案2:调整Lombok注解,取消类的final修饰(保留不可变特性)
如果不想修改Mockito配置,可以替换@Value注解为等价的不可变注解组合,避免类被标记为final:
@ConfigurationProperties @ConstructorBinding @Getter // 仅生成getter方法,不生成setter @AllArgsConstructor // 提供全参数构造器,满足@ConstructorBinding的要求 @EqualsAndHashCode @ToString class PropertyConfig{ // 所有属性仍用private final修饰,保持不可变 // some code }
调整后类不再是final类型,同时所有属性仍为不可变,完全兼容原有的配置绑定逻辑,也可被Mockito正常mock。
方案3:直接构造测试实例(无需mock)
由于配置属性类本身仅承载属性,无复杂业务逻辑,测试时可以直接调用构造方法手动构造符合测试要求的实例,不需要mock,这种方案最简单也最符合不可变类的使用习惯。
内容的提问来源于stack exchange,提问作者m23
相关产品推荐
相关产品推荐

