Validator验证VehiculeFrontDto时集合非空,测试是否有误?
问题:验证合法VehiculeFrontDto时anomalies集合不为空的原因分析
我无法理解为何使用合法的VehiculeFrontDto对象进行验证时,anomalies集合的isEmpty()方法却返回false。通过调试器查看anomalies变量,得到以下值:
interpolatedMessage: "Veuillez renseigner si votre véhicule est dérogatoire ou non." (id=344) messageTemplate: "{vehicule.derogatoire.obligatoire}" (id=348)
运行测试时抛出错误:
org.opentest4j.AssertionFailedError: expected: true but was: false
请问这种情况下,是不是测试代码编写有误?测试代码如下:
@Test public void testValidator() { VehiculeFrontDto vehiculeFrontDto = new VehiculeFrontDto(); vehiculeFrontDto.setImmat("test"); vehiculeFrontDto.setMarque("test2"); vehiculeFrontDto.setModele("test3"); vehiculeFrontDto.setDatePremiereImmat(new Date()); vehiculeFrontDto.setSituation(SituationVehiculeEnum.CAPA.getCode()); ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<VehiculeFrontDto>> anomalies = validator.validate(vehiculeFrontDto, Default.class); Assertions.assertTrue(anomalies.isEmpty()); }
问题根源
测试代码本身没有语法错误,但你创建的VehiculeFrontDto对象并不满足验证规则。从调试输出的错误信息可以明确看出:验证器要求必须填写车辆是否为豁免类型(对应字段derogatoire),但你在测试代码中完全没有给这个字段赋值,导致验证失败,anomalies集合自然不为空。
解决方法
- 补全必填字段值:在测试代码中为
derogatoire字段设置合法值,比如:
// 根据业务需求设置true或false vehiculeFrontDto.setDerogatoire(true);
- 检查验证注解配置:如果认为
derogatoire字段不应该是必填项,需要检查VehiculeFrontDto类中该字段的JSR-380验证注解(如@NotNull、@AssertTrue等),确认是否存在配置错误。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

