Java 找不到具有边界的POST的处理程序

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);

我正在测试使用HTTP服务器的应用程序。我决定使用HTTP服务器设备,而不是模拟。这意味着我不必模仿任何生产代码。为了实现这一目标,我目前选择了免费使用第三方库

我成功地创建了几个单元测试,它们通过GET请求工作。大多数都非常简单,即:

@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传递给fixd
server.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个声誉才能发表评论。