2015-01-26 6 views
0

아파치 httpclient LocalTestServer를 사용하여 WebDavClient (jackrabbit 기반)에 대한 통합 테스트를 작성하려고합니다. 나는 다음과 같은 blog에서 영감을 테스트 아래에 작성되었습니다 : 통합 아파치를 사용하여 webDav 클라이언트에 테스트 httpclient LocalTestServer

public class WebDAVClientIT { 

    private LocalTestServer server; 

    @Before 
    public void setup() throws Exception{ 
     server = new LocalTestServer(null, null); 
     server.start(); 
     //direct all requests to my handelr 
     server.register("/*", new WebDavHandler()); 
    } 

    @Test 
    public void testUploadFileStringInputStreamString() throws Exception { 

     WebDAVClient webDavClient = new WebDAVClient(); 
     //set the client user/pass etc 
     webDavClient.init(); 

     byte[] data = "123,456,789,123,456,789".getBytes(); 
     InputStream input = new ByteArrayInputStream(data); 
     Status uploadFileStatus = webDavClient.uploadFile("test/file.csv", input, "text/csv"); 
     assertThat(uploadFileStatus.getStatusCode(), is(HttpStatus.SC_CREATED)); 

    } 

    @After 
    public void distory() throws Exception { 
     server.stop(); 
    } 
} 

나는 서버가 WebDAV 서버 같은 느낌 만들 것 요청 처리기를 만들었습니다.
public class WebDavHandler implements HttpRequestHandler { 
     private Map<String, String> resources; 
     public WebDavHandler() { 
      //map existing resources 
      resources = new HashMap<>(); 
     } 

     @Override 
     public void handle(HttpRequest request, HttpResponse response, 
       HttpContext context) throws HttpException, IOException { 
      RequestLine requestLine = request.getRequestLine(); 
      String method = requestLine.getMethod(); 
      String uri = request.getRequestLine().getUri(); 

      switch (method) { 
      case "GET": 
       if (resources.containsKey(uri)) { 
        response.setStatusCode(HttpStatus.SC_OK); 
       } else { 
        response.setStatusCode(HttpStatus.SC_NOT_FOUND); 
       } 
       break; 
      case "MKCOL": 
       if (resources.containsKey(uri)) { 
        response.setStatusCode(HttpStatus.SC_OK); 
       } else { 
        response.setStatusCode(HttpStatus.SC_CREATED); 
        resources.put(uri, uri); 
       } 
       break; 
      } 
      logger.info("Executing " + request); 
     } 

    } 

지금 내 문제는 LocalTestServer 실제 WebDAV 서버가 아닌 및 WebDAV 지원하는 방법 중 일부는 LocalTestServer 예를 들어, 지원되지 않을 것입니다
[statusCode=501, statusText=Internal Server Error, responseString=MKCOL method not supported] 

MkColMethod

어떻게 WebDAV를 실종 방법을 에뮬레이트 할 수있는 LocalTestServer을 확장 않습니다.

답변

2

추가 요청 방법을 알고있는 사용자 지정 연결 팩토리를 삽입해야합니다.

이 예제를 함께 사용하기 위해 HttpClient 4.4를 사용합니다.

public class TestDAV extends LocalServerTestBase { 

    @Before @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     HttpRequestFactory requestFactory = new DefaultHttpRequestFactory() { 
      @Override 
      public HttpRequest newHttpRequest(final RequestLine requestline) throws MethodNotSupportedException { 
       if (requestline.getMethod().equalsIgnoreCase("BLAH")) { 
        return new BasicHttpRequest(requestline); 
       } 
       return super.newHttpRequest(requestline); 
      } 
     }; 
     HttpMessageParserFactory<HttpRequest> requestParserFactory = new DefaultHttpRequestParserFactory(
       BasicLineParser.INSTANCE, requestFactory); 
     DefaultBHttpServerConnectionFactory connectionFactory = new DefaultBHttpServerConnectionFactory(
       ConnectionConfig.DEFAULT, requestParserFactory, DefaultHttpResponseWriterFactory.INSTANCE); 
     this.serverBootstrap.setConnectionFactory(connectionFactory); 
    } 

    @Test 
    public void testBlah() throws Exception { 

     this.serverBootstrap.registerHandler("/stuff", new HttpRequestHandler() { 
      @Override 
      public void handle(
        final HttpRequest request, 
        final HttpResponse response, 
        final HttpContext context) throws HttpException, IOException { 
       response.setEntity(new StringEntity("Blah", ContentType.TEXT_PLAIN)); 
      } 
     }); 

     final HttpHost target = start(); 
     final HttpRequest get = new BasicHttpRequest("BLAH", "/stuff"); 
     final CloseableHttpResponse response = this.httpclient.execute(target, get); 
     try { 
      Assert.assertEquals(200, response.getStatusLine().getStatusCode()); 
      EntityUtils.consume(response.getEntity()); 
     } finally { 
      response.close(); 
     } 
    } 

} 
+0

저는 httpclient 4.3.1을 사용하고 있으며, 4.4의 소스 코드를 보면 예제가 컴파일에 실패합니다. 4.3을 사용할 수 있습니까? –

+0

가능해야합니다. 4.4보다 편리하게 사용할 수 있습니다. – oleg

+0

connectionFactory를 설정하는 방법을 찾지 못했습니다. –