2

클래스 유효성 검사 테스트에 대해 Hibernate docs을 읽었으며 "문제"에 대한 해결책을 찾지 못했습니다. 내 사용자 정의 유효성 검사기를 테스트하고 싶습니다.최대 절전 유효성 검사기 단위 테스트

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 */ 
} 

내가 모든 사용자가 바르셀로나 시내에 위치하고 있는지 확인하려면 : 예를 들어, 나는 다음과 같은 클래스가 있다고 가정 해 보자.

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"); 
     } 
    } 

} 

내가 어떻게 대신 기본 예제에서 제공하는 하나의 사용자 정의 유효성 검사기를 사용하는 아무 생각 만 검사 필드 제약이 아니라 더 많은 주석 것을 다음과 같이 그 동안, 난 내 사용자 지정 사용자 유효성 검사기 구현을 할 것이다 "비즈니스 로직". 그것에 관한 모든 예나 단서?

감사합니다.

+0

을? – Hippoom

+0

안녕하세요 @Hippoom, 저는 Spring 3.2.3.RELEASE를 사용하고 있습니다. 이 예제 (http://stackoverflow.com/questions/9744988/writing-junit-tests-for-spring-validator-implementation)를 찾았지만이 예제에서는 필요하지 않은 유효성 검사 그룹을 지원하지 않는다고 생각합니다. 어쨌든 어떤 점에서 – jarandaf

답변

1

: ("그룹"지정 어떤 주석)

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/test-applicationContext.xml"}) 
public class UserValidatorTest { 

    private static Logger logger = Logger.getLogger(UserValidatorTest.class); 

    @Autowired 
    private UserValidator validator; //my custom validator, bean defined in the app context 

    @Test 
    public void testUserValidator(){ 
     User user = new User("name", "1234567", "Barcelona"); 
     BindException errors = new BindException(user, "user"); 
     ValidationUtils.invokeValidator(validator, user, errors); 
     Assert.assertFalse(errors.hasErrors()); 
    } 

} 

내가 확인 한 검증 그룹을 그들은 단순히 오류 후 추가하여합니다 (invokeValidator 정적 방법으로 작업 매개 변수).

4

단위 테스트를 위해 스프링 유효성 검사기를 구현할 필요는 없으며이를 위해 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)); 
    } 
} 

내가 사용하고 싶은 폼 또는 RPC 요청이 아니라 내 expierence이 몇 가지 "비즈니스 로직을"검증하는 검증. 그들은 내 관점에서 Domain Layer에서 사용하기가 쉽지 않습니다.

나는 마침내 해결책 발견
+0

컨트롤러에 대한 유효성 검사로 인해 일부 유효성 검사를하는 경우 컨트롤러에이 유효성 검사기를 삽입해야합니다. – renanlf

+0

스프링 3.2.0 이상을 사용할 때 ModelAttribute에서 @Valid를 사용할 수 있습니다. 커스텀 Spring Validator를 구현해야한다. – Hippoom

+0

당신의 대답을 정확하게 이해할 수 있는지 확신 할 수는 없지만,이 경우는 내 케이스 인 javax.validation 주석과 사용자 정의 스프링 유효성 검사기 만 검사합니다 (http://static.springsource.org/spring/docs/3.2 참조). x/spring-framework-reference/html/validation.html). 위의 예에서 비어 있거나 크기 제약 조건 만 체크하지는 않지만 필드 도시에서 허용되는 유일한 값은 "Barcelona"입니다. – jarandaf

1

내가 대신 나는 (심지어 Spring 컨텍스트에서 작업) 다음에 결국 봄 통합 하나의 단위 테스트를 쓰고 싶은대로 : 봄의 버전이 무엇

public class MyValidatorTest { 

    private Validator validator; 

    @Test 
    public void check() { 
    TestBean bean = new TestBean(); 
    bean.setMember(...); 

    Errors actual = invokeValidator(bean); 

    assertThat(actual.hasErrors(), is(!valid)); 
    // more assertions here 
    } 

    @Before 
    public void createValidator() { 
    // the validator to test is found be the @Constraint(validatedBy=...) in @MyValidation 
    validator = new SpringValidatorAdapter(Validation.buildDefaultValidatorFactory().getValidator()); 
    } 

    private Errors invokeValidator(Object bean) { 
    BeanPropertyBindingResult errors = new BeanPropertyBindingResult(bean, "bean"); 
    ValidationUtils.invokeValidator(validator, bean, errors); 
    return errors; 
    } 

    private static class TestBean { 
    @MyValidation 
    private AnyType member; 
    } 
}