返回

如何省略 Spring Boot 中的自定义验证注解以测试约束验证注解?

java

如何在 Spring Boot 中省略自定义验证注解(@ValidCity)以测试约束验证注解

问题

在测试 Spring Boot 中的约束验证注解时,您可能会遇到这样的错误:

jakarta.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: validator.ValidCityValidator.

这表明 Bean 验证框架无法实例化您的自定义验证器 @ValidCity

解决方案

要解决此问题,您可以使用 @Validated(Partial.class) 注解,如下所示:

@Test
    void shouldReturnViolationWhenNameIsGreaterThan50Chars() {
        //given
        SearchDto searchDto = SearchDto.builder()
                .name("name dkejdeodejdoewjdowed jeiod jeidj eiodjweiodjeiodjeiodjeoidjeoijdioe jdo")
                .city("country")
                .number("number")
                .locality("locality")
                .street("street")
                .postalCode("54-222")
                .build();

        //when
        Set<ConstraintViolation<SearchDto>> validate = validator.validate(searchDto, Partial.class);

        //then
        assertThat(validate).hasSize(1);
        assertThat(validate.iterator().next().getMessage()).isEqualTo("name must not be greater than 50");
    }

@Validated(Partial.class) 注解的用途

@Validated(Partial.class) 注解允许您仅在验证过程中考虑某些约束。在这种情况下,它将忽略 @ValidCity 注解,因为您已经为它编写了单独的测试。

其他建议

  • 确保使用正确的完整类名,而不是别名。
  • 检查您的 @ValidCity 注解是否正确实现了 ConstraintValidator 接口。
  • 检查测试环境中是否正确配置了 Bean 验证工厂。

结论

使用 @Validated(Partial.class) 注解,您可以轻松地省略自定义验证注解以测试 Spring Boot 中的约束验证注解。请记住,仅在测试需要时才使用此技术,否则可能导致验证问题。

常见问题解答

  1. 我还可以使用哪些方法来忽略自定义验证器?

    • 您还可以使用 @IgnoreConstraintValidation 注解或在测试方法上使用 @DisableConstraints 注解。
  2. @Validated(Partial.class) 注解有什么限制?

    • 它仅忽略在 Partial 阶段验证的约束。
  3. 如何在生产代码中使用 @Validated(Partial.class) 注解?

    • 不建议在生产代码中使用此注解,因为它可能会导致验证问题。
  4. 我应该什么时候使用 @Validated(Partial.class) 注解?

    • 仅当您需要在测试中忽略特定约束时才使用此注解。
  5. 我该如何配置 Bean 验证工厂?

    • 您可以在 application.properties 文件中配置 Bean 验证工厂。