Java 找不到具有边界的POST的处理程序
我正在测试使用HTTP服务器的应用程序。我决定使用HTTP服务器设备,而不是模拟。这意味着我不必模仿任何生产代码。为了实现这一目标,我目前选择了免费使用第三方库 我成功地创建了几个单元测试,它们通过GET请求工作。大多数都非常简单,即:Java 找不到具有边界的POST的处理程序,java,unit-testing,http,junit,Java,Unit Testing,Http,Junit,我正在测试使用HTTP服务器的应用程序。我决定使用HTTP服务器设备,而不是模拟。这意味着我不必模仿任何生产代码。为了实现这一目标,我目前选择了免费使用第三方库 我成功地创建了几个单元测试,它们通过GET请求工作。大多数都非常简单,即: @Test public void verifyConnectionTest() { try { final String body = FileUtils.readFileToString(RESOURCE);
@Test
public void verifyConnectionTest()
{
try
{
final String body = FileUtils.readFileToString(RESOURCE);
final String path = "/";
this.server.handle(Method.GET, path).with(
new HttpRequestHandler() {
@Override
public void handle(final HttpRequest request,
final HttpResponse response)
{
response.setStatusCode(200);
response.setContentType("text/xml");
response.setBody(body);
}
});
// Setting up my HTTP client
// Execute some tasks
// asserting of everything was valid
}
catch (final IOException e)
{
fail(e.getMessage());
}
}
但是我现在必须发送一个包含多部分/表单数据的POST请求。除了更改方法和内容类型外,这没有多大区别:
@Test
public void executeStepTest()
{
try
{
final String body = FileUtils.readFileToString(SERVICE_RESPONSE);
final String path = "/";
this.server.handle(Method.POST, path, "multipart/form-data").with(
new HttpRequestHandler() {
@Override
public void handle(final HttpRequest request,
final HttpResponse response)
{
response.setStatusCode(200);
response.setContentType("text/xml");
response.setBody(body);
}
});
// Setting up my HTTP client
// Execute some tasks
// asserting of everything was valid
}
catch (final IOException e)
{
fail(e.getMessage());
}
}
但是我得到了以下错误:[error]找不到POST-/-multipart/form数据的处理程序;boundary=bqCBI7t-VW1xaJW7BADmTiGMg9w_YM2sHH8ukJYx
我猜fixd不认识边界方。因为文档中没有显示示例,所以我对这一部分很感兴趣
我尝试使用一些通配符,如“*”,但没有成功。因此我需要一种方法,要么告诉fixd接受该边界,要么使用一些我还没有发现的通配符。任何帮助都会很好,谢谢 我一直在进行一些调试,问题似乎出在
fixd
内核中
基本上,fixd
通过映射handlerMap
中的HandlerKey
(包括ContentType作为键的一部分)对每个RequestHandlerImpl
进行索引。请参阅方法org.bigtesting.fixd.core.FixtureContainer#resolve
...
HandlerKey key = new HandlerKey(method, route, contentType);
RequestHandlerImpl handler = handlerMap.get(key);
if (handler == null) {
// Error
}
...
问题:当请求是多部分/表单数据
时,边界
数据(它在每个请求中自动生成)是内容类型的一部分。因此,在handlerMap
中可以找到任何处理程序,因为每次运行时键都会发生变化
我做了一个小测试,只是为了检查这是否是问题的原因,将contentType传递给fixdserver.handle,在创建多部分请求后处理,它工作正常
请参见下面的测试:
@Test
public void verifyConnectionTest_multipart() {
try {
// 1. Create multipart request (example with http-commons 3.1)
PostMethod filePost = new PostMethod(url);
Part[] parts = { new StringPart("param", "value") };
MultipartRequestEntity request = new MultipartRequestEntity(parts, filePost.getParams());
filePost.setRequestEntity(request);
// 2. fixd server handle (passing the request content type)
this.server.handle(Method.POST, "/", request.getContentType()).with(
new HttpRequestHandler() {
@Override
public void handle(final HttpRequest request,
final HttpResponse response) {
response.setStatusCode(200);
response.setContentType("text/xml");
}
});
// 3. Execute multipart request
HttpClient client = new HttpClient();
int status = client.executeMethod(filePost);
// 4. Assertions
Assert.assertEquals(200, status);
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
希望它能帮助你澄清这个问题。Cheers这是fixd
中的一个错误,在1.0.3版中已修复。您的原始代码应该使用此新版本的fixd
完美捕获!我在寻找正确的方向,但无法解决它。系统现在正在推出一个HttpPost对象(org.apache.http.client.methods.HttpPost)。从这一点上,我可以检索内容类型-如果我想要(正确的)路径。把它交给fixd完成-我有把手。再次感谢!不客气。很高兴帮助你,谢谢你的赏金;)这可能是一条评论。我最初试图发表评论,但不被允许。我看到一条消息说我必须有50个声誉才能发表评论。