2017-01-30 1 views
2

특정 문자열에 대한 최대 절전 크기 제약 조건을 테스트 중이며 각 크기 제약 조건을 테스트하기 위해 별도의 함수를 만드는 대신 하나의 단위 테스트 메서드에서 모든 반환 코드를 확인하고 싶습니다. 오류 반환.여러 제약 조건 위반 반환 메시지 테스트

@Size(max = 10, message = "String a is too big") 
private String a; 

@Size(max = 20, message = "String b is too big") 
private String b; 

그리고 내 테스트 클래스에서 나는 현재이처럼 그들을 테스트입니다 : 그래서 나는 같이 내 자바 클래스의 일부 문자열이

@Test 
public void aIsTooLongTest(){ 
    ...code to set length of a as a string > 10 and b < 20 
    Set<ConstraintViolation<SomeObj>> constraintViolations = validator.validate(instanceOfSomeObj); 
    assertEquals(2, constraintViolations.size()); 
    assertEquals("String a is too big", constraintViolations.iterator().next().getMessage()); 
} 

난을 할 때이 잘 작동하지만 이런 테스트는 2 가지 별도의 메소드를 작성해야한다 (하나는 너무 크고 하나는 b가 너무 큰 경우). 이 방법을 a와 b가 너무 큰 한 방법에 결합하고 올바른 오류 메시지가 모두 반환되는지 확인하려고합니다. 문제는 특정 오류 반환 메시지에 액세스하는 방법을 찾지 못하는 것입니다. 예를 들어 코드

constraintViolations.iterator().next().getMessage() 

은 특정 순서로 오류 메시지를 반환하지 않습니다. 이 문제를 피하고 오류 코드를 테스트 할 수있는 방법이 있습니까? 아니면 각 사례를 별도의 방법으로 분리해야합니까?

+0

및 assertEquals에 접근한다. –

답변

1

반환되는 제약 조건 위반의 순서는 정의되지 않습니다. 그래서 당신은 그것에 의지 할 수 없습니다.

당신은 (그들이 assertj를 사용하지만 당신이없이 할 수있는) 우리의 시험 유틸을 살펴 할 수 있습니다 : 아마 어떻게 든지도에서 메시지를 저장하는 방법이, 거기에 내가 생각하고 https://github.com/hibernate/hibernate-validator/blob/master/test-utils/src/main/java/org/hibernate/validator/testutil/ConstraintViolationAssert.java

+0

AssertJ를 직접 사용하는 것도 고려할 수있다 : assertThat (constraintViolations) .extracting ("message") .containsOnly ("message 1", "message 2");'containsOnly()'는 지정된 요소의 순서 – Gunnar

관련 문제