【问题标题】:Integration Test to webDav client using apache httpclient LocalTestServer使用 apache httpclient LocalTestServer 对 webDav 客户端进行集成测试
【发布时间】:2015-01-26 08:34:33
【问题描述】:

我正在尝试使用 apache httpclient LocalTestServer 为 WebDavClient(基于 jackrabbit)编写集成测试。 我受到以下blog 的启发,编写了以下测试:

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 服务器,并且 LocalTestServer 不支持 WebDav 支持的某些方法,例如MkColMethod

[statusCode=501, statusText=Internal Server Error, responseString=MKCOL method not supported]

如何扩展 LocalTestServer 以模拟 webdav 缺少的方法。

【问题讨论】:

    标签: junit integration-testing webdav apache-httpcomponents


    【解决方案1】:

    您需要注入一个自定义连接工厂,它知道额外的请求方法。

    请注意,我使用 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();
            }
        }
    
    }
    

    【讨论】:

    • 我正在使用 httpclient 4.3.1 并且无法编译您的示例,查看 4.4 的源代码它们是一个很大的不同。可以用4.3吗?
    • 应该是可以的。 4.4只是让它更方便。
    • 我找不到如何设置connectionFactory
    • 我仔细查看了 4.3 测试代码。如果不分叉源,就无法替换测试服务器的连接工厂。请考虑升级到 HC 4.4
    • 感谢 oleg 的努力。我不能在 GA 之前使用 4.4。感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多