如何调整构造器参数逻辑解决EqualsVerifier测试校验报错问题
解决方案
问题根因为EqualsVerifier默认会通过反射生成任意类型的参数调用构造器,你仅配置了Configuration类的预制值,并没有覆盖构造器入参URI类型的生成规则,因此会生成无效URI触发校验报错。
方法1:调整测试配置,新增URI类型预制值(最推荐)
不需要改动业务代码,仅需要给EqualsVerifier补充URI类型的合法预制值即可,修改后测试代码如下:
@Test void Should_RespectEqualsContract() { EqualsVerifier .forClass(Configuration.class) // 给URI类型配置合法预制值,EqualsVerifier就不会自行生成无效URI .withPrefabValues( URI.class, URI.create("http://a.com"), URI.create("http://b.com")) .verify(); }
方法2:用工厂方法指定实例生成规则
如果你有多个复杂构造参数,也可以通过withFactory方法直接告诉EqualsVerifier如何构造合法的Configuration实例:
@Test void Should_RespectEqualsContract() { EqualsVerifier .forClass(Configuration.class) .withFactory( () -> new Configuration(URI.create("http://a.com")), () -> new Configuration(URI.create("http://b.com")) ) .verify(); }
方法3:调整构造器校验逻辑(不推荐,除非业务有需求)
如果确实需要修改业务代码兼容测试,可以在校验逻辑前增加规则判断,避免误拦截测试用特殊参数,这种方式会弱化业务校验规则,仅在特殊场景下使用:
public record Configuration(URI url) { public Configuration(URI url) { // 可根据业务需求调整判断规则,仅符合前提的参数执行校验 if (url != null && url.getScheme() != null && url.getScheme().startsWith("http")) { Validate.httpValid(url, "url"); } this.url = url; } }
内容的提问来源于stack exchange,提问作者Tristan MARIE
相关产品推荐
相关产品推荐

