2017-12-12 21 views
0

다른 패키지에서 내부 정적 static final 클래스를 인스턴스화하려고하는 유스 케이스가 있습니다. 나는 이것을 수행하여 응답을 유닛 테스팅에 조롱 할 수 있습니다. 모의 서버 (mock server)를 사용할 수는 있지만, 속도와 제어 테스트를 위해 모의 객체를 사용하고 싶습니다. 아래 코드는 다음과 같습니다.다른 패키지에서 Java의 내부 정적 정적 final 클래스를 인스턴스화하는 방법

public class Http { 
    private final HttpClient client; 

    @Inject 
    Http(HttpClient client) { 
    this.client = client; 
    } 

    public Http.Response get(Http.Request request) { 
    try { 
     Http.Response response = this.getResponse(this.client.execute(this.createHttpGet(request))); 
     return response; 
    } catch (IOException var4) { 
     throw new RuntimeException(var4); 
    } catch (URISyntaxException var5) { 
     throw new RuntimeException(var5); 
    } 
    } 

    private Http.Response getResponse(HttpResponse httpResponse) throws IOException { 
    Http.Response response = new Http.Response(httpResponse.getStatusLine().getStatusCode()); 
    response.setMessageBody(EntityUtils.toString(httpResponse.getEntity())); 
    return response; 
    } 

    public static final class Response { 
    private final int statusCode; 
    private ImmutableMap<String, String> headers; 
    private String message; 
    private String messageBody; 

    Response(int statusCode) { 
     this.statusCode = statusCode; 
    } 

    public int getStatusCode() { 
     return this.statusCode; 
    } 

    public Map<String, String> getHeaders() { 
     return this.headers; 
    } 

    void setHeaders(Map<String, String> headers) { 
     this.headers = ImmutableMap.builder().putAll(headers).build(); 
    } 

    public String getMessage() { 
     return this.message; 
    } 

    void setMessage(String message) { 
     this.message = message; 
    } 

    public String getMessageBody() { 
     return this.messageBody; 
    } 

    void setMessageBody(String messageBody) { 
     this.messageBody = messageBody; 
    } 

    public String toString() { 
     return String.format("HttpResponse{statusCode=%d, headers=%s, message='%s', messageBody='%s'}", this.statusCode, this.headers, this.message, this.messageBody); 
    } 
    } 
} 

답변

0

Http.Response 생성자는 다른 패키지에서 인스턴스화하려면 public이어야합니다.

가시성이 default이기 때문에 동일한 패키지에서만 인스턴스화 할 수 있습니다.

테스트 목적으로 필요합니다. 가시성을 변경하지 않으려면 Http 클래스와 동일한 패키지의 테스트 클래스에서 Responses을 인스턴스화하기위한 클래스 만 만들 수 있습니다.