Junit 使用apache httpclient LocalTestServer对webDav客户端进行集成测试

Junit 使用apache httpclient LocalTestServer对webDav客户端进行集成测试,junit,integration-testing,webdav,apache-httpcomponents,Junit,Integration Testing,Webdav,Apache Httpcomponents,我正在尝试使用ApacheHttpClient LocalTestServer为WebDavClient(基于jackrabbit)编写集成测试。 我从以下内容中得到启发,并将测试写在下面: public class WebDAVClientIT { private LocalTestServer server; @Before public void setup() throws Exception{ server = new LocalTestSe

我正在尝试使用ApacheHttpClient LocalTestServer为WebDavClient(基于jackrabbit)编写集成测试。 我从以下内容中得到启发,并将测试写在下面:

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缺少的方法。

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

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

}
公共类TestDAV扩展了LocalServerTestBase{
@在@Override之前
public void setUp()引发异常{
super.setUp();
HttpRequestFactory requestFactory=新的默认HttpRequestFactory(){
@凌驾
公共HttpRequest newHttpRequest(最终请求行请求行)抛出MethodNotSupportedException{
if(requestline.getMethod().equalsIgnoreCase(“BLAH”)){
返回新的BasicHttpRequest(请求行);
}
返回super.newHttpRequest(requestline);
}
};
HttpMessageParserFactory requestParserFactory=新的默认HttpRequestParserFactory(
BasicLineParser.INSTANCE,requestFactory);
DefaultBHttpServerConnectionFactory connectionFactory=新的DefaultBHttpServerConnectionFactory(
ConnectionConfig.DEFAULT、requestParserFactory、DefaultHttpResponseWriterFactory.INSTANCE);
this.serverBootstrap.setConnectionFactory(connectionFactory);
}
@试验
public void testBlah()引发异常{
这个.serverBootstrap.registerHandler(“/stuff”,新的HttpRequestHandler(){
@凌驾
公共无效句柄(
最终HttpRequest请求,
最终HttpResponse响应,
最终HttpContext上下文)引发HttpException,IOException{
setEntity(新的StringEntity(“Blah”,ContentType.TEXT_-PLAIN));
}
});
最终HttpHost目标=开始();
final-HttpRequest-get=new-BasicHttpRequest(“废话”,“东西”);
final CloseableHttpResponse response=this.httpclient.execute(target,get);
试一试{
Assert.assertEquals(200,response.getStatusLine().getStatusCode());
使用(response.getEntity());
}最后{
response.close();
}
}
}

我使用的是httpclient 4.3.1,但未能编译您的示例,看看4.4的源代码,它们之间的差别很大。可以使用4.3吗?应该可以。4.4只是让它更方便。我没有找到如何设置连接因子。我仔细查看了4.3测试代码。如果不分叉源,就无法替换测试服务器的连接工厂。请考虑升级到HC 4.4,谢谢奥列格的努力。我不能在GA之前使用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();
        }
    }

}