Hibernate验证器单元测试

jar*_*daf 2 hibernate spring-mvc hibernate-validator spring-validator

我一直在阅读关于类验证测试的Hibernate文档,我没有找到任何解决我的"问题"的方法.我想测试我的自定义验证器.例如,假设我有以下类:

public class User {

    @NotEmpty(message = "{username.notSpecified}")
    private String username;

    @NotEmpty
    @Size(min = 6, message = "{password.tooShort")
    private String password;

    @NotEmpty(message = "{city.notSpecified}")
    private String city;

    /* getters & setters omitted */
}
Run Code Online (Sandbox Code Playgroud)

我想检查每个用户是否位于巴塞罗那市.为此,我将自定义用户验证器实现如下:

public class UserValidator implements Validator {

    @Autowired 
    private Validator validator;

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
         validator.validate(target,errors);
         User user = (User) target;
         if(!(user.getCity().equals("Barcelona"))){
              errors.rejectValue("city", "city.notValid", "Invalid city"); 
         }
    }

}
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用这个自定义验证器而不是示例中提供的默认验证器,并且只检查带注释的字段约束而不是更多的"业务逻辑"约束.关于那个的任何例子或线索?

谢谢!

Yug*_*hou 5

您不必为单元测试实现spring Validator,只需为它创建一个javax.validation.Validator实例.

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import java.util.*;

import javax.validation.*;

import org.junit.*;

public class ApplierDtoUnitTests {

    private Validator validator = Validation.buildValidatorFactory().getValidator();
    private ApplierDto target = new ApplierDto();


    @Test
    public void brokenIfNullNameGiven() throws Exception {

        target.setName(null);

        Set<ConstraintViolation<ApplierDto>> constraintViolations = validator
            .validate(target);
        assertThat("unexpected size of constraint violations",
            constraintViolations.size(), equalTo(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望使用Validators来验证表单或RPC请求,而不是在我的expierence中验证一些"业务逻辑".从我的角度来看,它们在Domain Layer中并不容易使用.