Equalsverifier在quarkus:dev模式下运行测试失败如何解决
问题原因
该错误是Quarkus Dev模式的字节码增强机制导致的:EqualsVerifier默认通过反射直接修改类的private final字段来构造测试用例,本地IDE运行测试时不会加载Quarkus的类增强逻辑,反射操作可以正常执行;而在Quarkus Dev模式下,被测类被Quarkus的类加载器做了字节码增强,final字段的反射写入操作被限制,因此抛出异常。
解决方案
方案1:调整EqualsVerifier测试配置(最优方案,无业务侵入)
显式指定EqualsVerifier使用被测类的现有构造函数创建实例,无需反射修改final字段,修改测试类代码如下:
package a; import nl.jqno.equalsverifier.EqualsVerifier; import org.junit.jupiter.api.Test; class DingetjeTest { @Test void implementsEquals() { EqualsVerifier.forClass(Dingetje.class) .withNonnullFields("text") // 指定使用参数为String的构造函数创建实例 .withConstructor(String.class) .verify(); } }
该方案无需修改业务代码和Quarkus全局配置,仅调整测试逻辑即可解决问题。
方案2:排除被测类的Quarkus字节码增强
如果被测类不需要Quarkus的依赖注入、拦截器等增强能力,可以在src/main/resources/application.properties中添加如下配置,排除该类的增强处理:
quarkus.arc.exclude-types=a.Dingetje
注意如果该类是Quarkus管理的Bean,使用该方案会导致相关注解失效。
内容的提问来源于stack exchange,提问作者Talip
相关产品推荐
相关产品推荐

