2015-01-15 2 views
2

난과 같이 특정 엔드 포인트를 호출 할 필요가있는 HTTP API 클라이언트를 구축하고 확인합니다. 그러나, 예를 들어 mock http 서버에 대해 테스트 할 수 있도록 테스트를 위해이를 재정의 할 수 있어야합니다.는 정적 변수 주

가장 좋은 방법은 무엇입니까? 그것은 그냥 인스턴스 변수를 확인하고 시작 값을 제공하는 것입니다 :

private String endpoint = ="http://myapi...."; 

public void setEndpoint(String endpoint){ 
    ... 
} 
+0

'String ENDPOINT'가 정적이어야한다면,이 메소드는 설정 파일이나 다른 데이터 소스에서 적절한 값을 읽는'static' 메소드의 결과 값을 할당하십시오.이것은 WSDL 및 JAX-WS로 작업 할 때의 문제점 중 하나입니다. –

답변

3

음, 물론 많은이에 대한 해결책 및 수행하는 한 가지 방법은 기본 값으로 시스템 속성을 사용하는 것입니다있다 :

private static final String DEFAULT_ENDPOINT = "http://myapi...."; 
private static final String ENDPOINT = 
     System.getProperty("my.endpoint", DEFAULT_ENDPOINT); 

이렇게하면 문제를 해결할 수있는 구성 방법이 생깁니다. -D 매개 변수를 예로

private static final String ENDPOINT; 
static { 
    // do initialization here but do not throw any exceptions (bad practice) 
    // you can e.g. read from files etc... 

    // Then assign your constant... 
    ENDPOINT = 
} 

시스템 등록 정보는 명령 줄에서 전달되는 :

java -Dmy.endpoint=http://... 

를 정적 상수를 초기화 할 때 더 많은 유연성을 필요로하는 경우도 정적 초기화를 사용할 수 있습니다

하지만 내 의견으로는 더 나은 접근에 실제로 값을 입력합니다. 사용 :

public class ClassThatIsUsingTheConfig { 
    private final String endpoint; 
    public ClassThatIsUsingTheConfig(final String endpoint) { 
     this.endpoint = endpoint; 
    } 

    public void someMethod() { 
     // use endpoint 
    } 
} 

그런 다음 호출자 클래스에서 사용할 끝점을 선택하십시오. 테스트 케이스에서, 이것은 모의하기가 매우 쉬울 것입니다.

public class MyTest { 
    @Test 
    public void testMethod() { 
     ClassThatIsUsingTheConfig var = new ClassThatIsUsingTheConfig(TEST_ENDPOINT); 
     var.someMethod(); 
    } 
} 

public class MyProdClass { 
    public void prodMethod() { 
     ClassThatIsUsingTheConfig var = new ClassThatIsUsingTheConfig(PROD_ENDPOINT); 
     var.someMethod(); 
    } 
} 

dependency injection here에 대한 자세한 내용을 볼 수 있습니다. 당신은 그런 Spring Framework 또는 CDI 등의 관리 종속성을 프레임 워크의 일종을 사용하는 경우 보조 노트에


,이다 그 어떤 환경에 따라 다양한 방법으로 속성과 상수 (예 : 주입 할 수있을 것이 일반적이다 현재 실행 중임). 스프링 프레임 워크를 사용하는 경우 예, 당신은 속성의 파일에서 모든 상수를 선언하고 속성을 사용하여 주석을 삽입 할 수 있습니다

@Autowired 
public ClassWhoIsUsingTheConfig(@Value("my.endoint") final String endpoint) { 
    this.endpoint = endpoint; 
} 

자극에 대한 속성 파일의 라인을 따라 수 :

my.endpoint=http://prodserver... 


시험에 대한 등록 정보 파일은 다음과 같을 것이다 wheras :

my.endpoint=http://testserver... 

종속성 주입 엔진을 사용하는 방법은 매우 플렉스 수 있습니다 코드를 테스트 할 때 외부 상수, 경로, 리소스 등을 처리 할 수있는 방법을 제공하고 수명을 단순화합니다.