Junit 使用apache httpclient LocalTestServer对webDav客户端进行集成测试
我正在尝试使用ApacheHttpClient LocalTestServer为WebDavClient(基于jackrabbit)编写集成测试。 我从以下内容中得到启发,并将测试写在下面: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
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();
}
}
}