2012-04-18 3 views
0

클래스의 각 값이 고유한지 확인하기 위해 Constants 클래스에 대해 실행할 테스트를 생성해야했습니다. 난 상수 이름에 대해 이야기하는 것이 아니다. (IDE는 그것들이 dup되었는지 개발자에게 알려줄 것이다) 오히려 상수가 설정되는 값이다.상수 클래스의 문자열 값을 비교하십시오.

저는 Java에 익숙하지 않으며이를 수행하는 방법에 대해 확신하지 못했습니다. 다음과 같이

명확하게하기 위해이 내 Constants 클래스가 정의 :

public static final String STATUS_RECEIVED = "RE"; 
public static final String STATUS_CANCELLED = "CA"; 
public static final String STATUS_REVIEWED = "RE"; 

을 위의 예에서, 나는 (STATUS_RECEIVED == STATUS_REVIEWED부터) 중복되는 값이 있습니다 내 테스트를 원하는 것입니다. 프로그래밍 방식으로 어떻게하면 좋을까요?

+2

, 당신은 아마 그들을 일종의 열거 형으로 사용합니다.가능한 값에 열거 형을 사용할 수 있습니다. 이것은 컴파일러가 중복 된 상수 이름을 잡는 것처럼 중복 된 항목으로 컴파일되지 않습니다. 그냥 생각 ... –

답변

2
Field[] fields = Constants.class.getDeclaredFields(); 
List<Field> staticFields = new ArrayList<>(); 
for(Field f:fields) { 
    if (Modifier.isStatic(f)) { 
    staticFields.add(f); 
    } 
} 
for (int i = 0; i < staticFields.size(); i++) { 
    for (int j = i + 1; j < staticFields.size(); j++) { 
    if (staticFields.get(i).get(null).equals(staticFields.get(j).get(null))) { 
     throw new AssertionFailedError(staticFields.get(i) + " equals " 
     + staticFields.get(j)); 
    } 
    } 
} 
+0

굉장! 첫 번째 라인은 나를위한 훌륭한 킥 스타터입니다. 코드를 보내 주셔서 감사합니다. – acedanger

+0

@acedanger 이것은 현재'Constants' 클래스를위한 훌륭한 해결책입니다. 그러나 나는 enum을 대신 사용하도록 강력히 권하고 싶다. 유스 케이스는 정확히 설계된 것이다. – darrengorman

+0

정말 고맙게 생각합니다. 프로젝트 리드와 논의하겠습니다. – acedanger

2

모든 상수의 문자열 값을 반복하고 세트에없는 경우 세트에 고정하십시오. 그들이 이미 세트에 있다면 테스트가 실패합니다.

그런 다음 다른 세트에 복제본을 부착하고 해당 중복 세트를 비어 있으면 테스트 할 수 있습니다. 즉, 테스트를 실행할 때마다 중복 목록을 제공합니다 (모든 중복을 제거 할 때까지 테스트).

+0

아이디어 주셔서 감사. – acedanger

0

대신 enum을 사용하면 훨씬 쉬울 것입니다. 그런 다음 멤버 이름이

enum Status { 
    averbosenamedescribingwhatremeans("RE") 
    etc, etc 

    private final String statusCode; 

    Status(String code) { 
    this.statusCode = code; 
    } 
} 
당신은

것 컴파일러가 고유하도록 보장

enum Status { 
RE,CA,RE; 
} 

이 경우 필요한 값과 일치하거나 속성으로 값을 저장하기 사이에서 선택을 할 것이다 열거 형에서 제공하는 values ​​() 메서드를 사용하여 단위 테스트 내에서 코드의 고유성을 쉽게 확인할 수 있습니다.

더하기 안전 코드를 입력하십시오.

현재 접근 방식을 사용하면 리플렉션을 통해 클래스를 쿼리해야합니다.

1

필드를 발견하고 고유성을 검사 할 수 있습니다 (예 : 트리 맵에 입력 한 다음 개수 계산).

public void test() throws Exception { 
    for (Field f : ConstantsClass.class.getDeclaredFields()) { 
     System.out.println(f.getName() + ": " + f.get(null)); 
    } 
} 

Accessing Java static final ivar value through reflection

0

String 값을 갖는 ConstantsEnum으로 설정하는 것이 좋습니다. 뭔가 같은 :

public enum Constants { 

    STATUS_RECEIVED("RE"), 
    STATUS_CANCELLED("CA"), 
    STATUS_REVIEWED("RE") 

    private String value; 

    public Constants(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 
} 

그런 다음 테스트는 각 Enum 상수의 value 필드를 반복하고 값이 이미 예를 들어이있는 경우 실패 할 수 있습니다 : 당신의 상수가 고유해야하는 경우

public void testConstantValueUniqueness() { 
    Set<String> values = new HashSet<String>(); 
    for(Constants constant : Constants.values()) { 
     if(values.contains(constant.getValue())) { 
      // fail 
     } 
     values.add(constant.getValue()); 
    } 
} 
관련 문제