2014-04-19 2 views
0

나는 인스턴스화되지 않고 정적 메서드로만 구성된 클래스가 있습니다. catch (IOException e) 부분을 제외하고 getProperty()의 모든 부분을 처리했지만 코드에 도달 할 수없는 것 같습니다. 코드의 신뢰할 수없는 부분

public class ResourceUtils 
{ 

    private static final String IOEXCEPTION_ERROR_MESSAGE = "ERROR: Problem reading StringBundles.properties"; 

    private static final String PATH_STRING_BUNDLE = "com/qn/config/StringBundles.properties"; 

    public static String getProperty(String key) 
    { 
     Properties property = new Properties(); 
     try 
     { 
      property.load(ResourceUtils.class.getClassLoader().getResourceAsStream(PATH_STRING_BUNDLE)); 
     } 
     catch(IOException e) 
     { 
      System.err.println(IOEXCEPTION_ERROR_MESSAGE); 
      e.printStackTrace(); 
      return null; 
     } 
     return property.getProperty(key); 
    } 

나는 어디 PATH_STRING_BUNDLE에서 유효 할 것이다 시나리오를 테스트하고 싶었 그것은 캐치 (IOException이 전자)를 통과 벽. 그러나 PATH_STRING_BUNDLE에는 최종 수정자가 있습니다. 이것을 테스트하는 방법을 제안 해 주시겠습니까? 아니면이 부분을 테스트하는 것이 꽤 쓸모 없거나 클래스의 디자인에 문제가있을 수 있습니다.

+0

정말 도달 할 수 없다면,'throw new assertionError (e);'와 같은 것을 넣어서 나중에 도달 할 수있게되면 정말 명백합니다. – immibis

답변

0

단위 테스트에서 com/qn/config/StringBundles.properties 파일의 이름을 임시 바꾸고 코드를 실행하십시오. 테스트가 완료되면 다시 이름을 바꿉니다.

0

이 상황에서 나는 보통이 즉각적인 해결책을 사용한다. (더 깨끗한 해결책이 있지만 더 넓은 리팩토링이 필요하다.) 나는 하나의 여분의 매개 변수를 취하는이 메소드의 새로운 오버로드를 만들고 그 대신에이 매개 변수를 사용한다. PATH_STRING_BUNDLE 상수. 그런 다음 원본 메서드를 변경하여 단순히 PATH_STRING_BUNDLE을 새 오버로드로 전달합니다.

import java.io.IOException; 
import java.util.Properties; 

public class ResourceUtils 
{ 
    private static final String IOEXCEPTION_ERROR_MESSAGE = "ERROR: Problem reading StringBundles.properties"; 

    private static final String PATH_STRING_BUNDLE = "com/qn/config/StringBundles.properties"; 

    public static String getProperty(String key) { 
     return getProperty(key, PATH_STRING_BUNDLE); 
    } 

    static String getProperty(String key, String bundlePath) 
    { 
     Properties property = new Properties(); 
     try 
     { 
      property.load(ResourceUtils.class.getClassLoader().getResourceAsStream(bundlePath)); 
     } 
     catch(IOException e) 
     { 
      System.err.println(IOEXCEPTION_ERROR_MESSAGE); 
      e.printStackTrace(); 
      return null; 
     } 
     return property.getProperty(key); 
    } 
} 

지금 당신이 번들 경로가 두 번째 매개 변수에 원하는 값을 전달 새로운 과부하를 호출하여 간단하게 고장 시나리오를 테스트 할 수 있습니다 : 여기에 코드처럼 보이는 방법입니다.