spring - 使用 Autowiring 的 spring 服务测试自定义验证器

标签 spring validation testing hibernate-validator

我有一个用于我的实体的自定义 Hibernate 验证器。我的一个验证器使用 Autowiring 的 Spring @Repository。该应用程序运行良好,我的存储库在我的验证器上成功 Autowiring 。

问题是我找不到测试我的验证器的方法,因为我无法将我的存储库注入(inject)其中。

人.类:

@Entity
@Table(schema = "dbo", name = "Person")
@PersonNameMustBeUnique
public class Person {

    @Id
    @GeneratedValue
    @Column(name = "id", unique = true, nullable = false)
    private Integer id;

    @Column()
    @NotBlank()
    private String name;

    //getters and setters
    //...
}

PersonNameMustBeUnique.class

@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { PersonNameMustBeUniqueValidator.class })
@Documented
public @interface PersonNameMustBeUnique{
    String message() default "";

    Class<?>[] groups() default {};

    Class<? extends javax.validation.Payload>[] payload() default {};
}

验证器:

public class PersonNameMustBeUniqueValidatorimplements ConstraintValidator<PersonNameMustBeUnique, Person> {

    @Autowired
    private PersonRepository repository;

    @Override
    public void initialize(PersonNameMustBeUnique constraintAnnotation) { }

    @Override
    public boolean isValid(Person entidade, ConstraintValidatorContext context) {
        if ( entidade == null ) {
            return true;
        }

        context.disableDefaultConstraintViolation();

        boolean isValid = nameMustBeUnique(entidade, context);

        return isValid;
    }

    private boolean nameMustBeUnique(Person entidade, ConstraintValidatorContext context) {
        //CALL REPOSITORY TO CHECK IF THE NAME IS UNIQUE 
        //ADD errors if not unique...
    }
}

上下文文件有一个验证器 bean:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

同样,它工作正常,但我不知道如何测试它。

我的测试文件是:

@RunWith(MockitoJUnitRunner.class)
public class PersonTest {

    Person e;
    static Validator validator;

    @BeforeClass
    public static void setUpClass() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
    }

    @Test
    public void name__must_not_be_null() {
        e = new Person();
        e.setName(null);
        Set<ConstraintViolation<Person>> violations = validator.validate(e);
        assertViolacao(violations, "name", "Name must not be null");
    }

}

最佳答案

您可以在测试中将以下 bean 添加到您的 Spring 上下文中:

@RunWith(SpringRunner.class)
@Import(LocalValidatorFactoryBean.class)
public class PersonTest {

  @Autowired
  private Validator validator;

  {
    validator.validate(new Person());
  }

  ...
}

关于spring - 使用 Autowiring 的 spring 服务测试自定义验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610061/

相关文章:

java - Spring Rest Controller 不适用于文件上传

validation - 如何为添加的 ScriptMethod 成员强制执行参数?

performance - JMeter:采样器结果中的 "Response code: 500, Response message: Internal Server Error"

java - Spring Batch FlatFileItemReader 继续错误数量的 token

spring - 哪个工具可以验证 Spring 配置

Spring Boot @WebIntegrationTest 和 TestRestTemplate - 是否可以回滚测试事务?

c# - 带枚举的 RangeAttribute

javascript表单验证和表单 Action 冲突

testing - 如何在不同于 lib (Elixir) 的路径中加载文件

php - 在 php 中与 FactoryMuffin 的一对多关系?